Как инициализировать члены подобъекта базового класса в 0? - PullRequest
3 голосов
/ 07 марта 2011
class A
{
  public: int a,b,c;
};

class B: public A
{
   public: int d;
   B():d(0){} // Some hackery needed here
};

int main()
{
   B obj;
   std::cout<< obj.a << std::endl; // garbage
   std::cout<< obj.b << std::endl; // garbage
   std::cout<< obj.c << std::endl; // garbage
   std::cout<< obj.d << std::endl; // 0
}

Как элементы данных подобъекта a, b и c могут быть инициализированы в 0? Мне не разрешено изменять класс А.

Ответы [ 5 ]

8 голосов
/ 07 марта 2011

Попробуйте

B() : A() , d(0){}

Значение A () инициализирует A, и, поскольку A является POD, элементы будут по умолчанию (ноль) инициализированы


4 голосов
/ 07 марта 2011

Я проверил это, так как думал, что это может работать (даже без ответа Прасуна)

B::B() : A(), d(0)
{
}

может работать, потому что вы тогда "инициализируете" A.

Это не так,Кстати.Вывод: 1,32,123595988

Это будет работать, хотя:

// put this in B.cpp anonymous namespace
const A a_init = { 0, 0 ,0 };

с последующим:

B::B() : A( a_init), d(0)
{
}

Я тестирую с использованием g ++ 4.3.2.Сейчас ЭТО работает:

B::B() : A(A()), d(0)
{
}
1 голос
/ 07 марта 2011

Конечно, правильно, чтобы конструктор А инициализировал свои члены.В противном случае, поскольку члены не являются частными, вы можете назначить им значения внутри конструктора B.

a = 0;

и т. Д., На самом деле работает.

1 голос
/ 07 марта 2011

объявить конструктор производного класса, как показано ниже

class B: public A
{
   public: int d;
   B():a(0),b(0),c(0),d(0)
   {

   }

};
1 голос
/ 07 марта 2011

Возможно, я что-то упустил, но как насчет этого?

class B: public A
{
    public: int d;
    B():d(0){a=b=c=0;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...