У вас нет для использования списка инициализаторов, вы определенно также должны использовать список инициализаторов на этом этапе.
При построении объекта, перед вводом кода конструктора все переменные-члены уже построены. Если вы не дадите инициализаторы, они будут созданы по умолчанию.
Также вы не можете снова создать переменную после того, как она уже была создана. Ваш
this->b(x+3)
не говорит компилятору о создании b
, он говорит ему вызвать функцию с именем b
для вашего объекта. Такая функция не существует в вашем классе, следовательно, ошибка. Обратите внимание, что после того, как объект был сконструирован в переменную, уже невозможно снова вызвать конструктор для этой переменной (только для изменения значения).
Значение можно изменить с помощью =
, как и в большинстве языков. Следовательно, вы можете сделать:
Foo::Foo(int x)
{
this->b = Bar(x+3);
}
Это означает, что вы создаете еще один безымянный объект Bar
и присваиваете его значение this->b
. Вы должны знать, что это означает, что вы создадите два Bar
объекта при создании Foo
. Сначала созданный по умолчанию, прежде. Вводится код конструктора, затем новый безымянный. Затем вы, наконец, присвойте значение уже сконструированному объекту, поэтому этот код гораздо более неэффективен, чем тот, который использует списки инициализаторов.
РЕДАКТИРОВАТЬ :
Так как я пропустил второй doesn't work
в приведенном выше коде, здесь некоторая дополнительная информация:
Вы также пытаетесь инициализировать b
непосредственно в конструкторе производного объекта DerFoo
. Однако, как только эта часть кода достигнута, она уже создана. Следовательно, любая попытка построить его в производном конструкторе запаздывает.
Следовательно, вы должны либо добавить еще один конструктор к Foo
, который принимает значение, и использовать его в вашем конструкторе DerFoo
. Это решение является предпочтительным, поскольку оно будет создавать объект Bar
в b
только один раз. Если вы не можете добавить такой конструктор, вам нужно использовать присваивание в коде конструктора для DerFoo
.
Попытка инициализации b
непосредственно в конструкторе DerFoo
не будет работать, даже если используется оператор определения объема.
DerFoo::DerFoo() : Foo::b(x-3) {}
все равно выдаст ошибку: http://ideone.com/6H8ZD