Построение объекта с конструктором не по умолчанию внутри класса C ++ - PullRequest
0 голосов
/ 20 февраля 2011

Я новичок в C ++, и ниже приводится краткое описание проблемы.Конструктор Bar должен явно вызывать конструктор foo, а аргумент конструктора foo должен быть объектом baz, который имеет конструктор по умолчанию.Мне не разрешено использовать новый оператор (динамическое размещение) для достижения этой цели.Я попробовал приведенный ниже код, но компилятор C ++ выдает мне ошибки компиляции (перечислены ниже).Может кто-нибудь объяснить мне, что не так в этом коде?Любая помощь очень ценится.

//Constructor.cpp
#include <iostream>
using namespace std;    // two of two, yay!

class baz {
public:
baz() { };
};

class Foo {
public:
Foo(baz y) { }
};

class Bar  {
public:
Foo x;
baz y;
Bar() : Foo(y) { };
};

int main() {
Bar b;
}

Syntax Error on compiling.
--------------------------
constructor.cpp: In constructor `Bar::Bar()':
constructor.cpp:19: error: type `Foo' is not a direct base of `Bar' 
constructor.cpp:19: error: no matching function for call to `Foo::Foo()'
constructor.cpp:9: note: candidates are: Foo::Foo(const Foo&)
constructor.cpp:11: note:                 Foo::Foo(baz)

Ответы [ 2 ]

3 голосов
/ 20 февраля 2011
Bar() : Foo(y) { };

Что ты здесь делаешь? Foo не является членом Bar. Это тип. x является членом типа Foo.

Но даже если вы напишите x(y), есть проблема в порядке инициализации. Так как x зависит от y, то y должен быть инициализирован до x. Поэтому объявите y перед x, чтобы обеспечить правильную инициализацию!

Я бы предложил это изменение:

class Bar  
{
   public:
      baz y;
      Foo x; //NOTE : x declared after y, as x is depending on y!
      Bar() : x(y) {}
};
1 голос
/ 20 февраля 2011

Bar не является производным от Foo, у него есть член с именем x типа Foo, поэтому x должен появиться в mem-initializer-list .

Bar : x(y) {}

Однако для того, чтобы это было действительным, объявление y должно появляться перед объявлением x в определении class Bar, поскольку порядок инициализации членов класса всегда происходит в том порядке, в котором объявления членов появляются в определении класса, и, если вы инициализируете x из y, вы захотите инициализировать y до x.

Также обратите внимание, что после определения class baz.

вам не хватает точки с запятой.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...