在C ++类中构造具有非默认构造函数的对象

时间:2011-02-20 15:39:28

标签: c++ constructor oop

我是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 个答案:

答案 0 :(得分:3)

Bar() : Foo(y) { };
你在这做什么? Foo不是Bar的成员。这是一种类型。 xFoo类型的成员。

但即使您编写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定义后,您缺少分号。