我是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)
答案 0 :(得分:3)
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 :(得分:1)
Bar
不是来自Foo
,它有一个名为x
的成员Foo
,因此x
必须出现在内存中-initializer列表
Bar : x(y) {}
为了使其有效,y
的声明必须出现在x
的{{1}}声明之前,作为一个类成员的初始化顺序总是如此以成员声明在类的定义中出现的顺序发生,如果您从class Bar
初始化x
,则需要在y
之前初始化y
另请注意,在x
定义后,您缺少分号。