【问题标题】:Construction of object with non-default constructor inside C++ class在 C++ 类中使用非默认构造函数构造对象
【发布时间】:2011-02-20 15:39:28
【问题描述】:

我是 C++ 新手,下面提到的是问题的摘要。 Bar 的构造函数需要显式调用 foo 的构造函数,并且 foo 的构造函数的参数必须是 baz 的对象,baz 具有默认构造函数。我不允许使用 new 运算符(动态分配)来实现这一点。我尝试了下面的代码,但 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)

【问题讨论】:

  • 第一堂课后少了;。
  • 对不起,我的错。添加了分号。

标签: c++ constructor oop


【解决方案1】:
Bar() : Foo(y) { };

你在这里做什么? Foo 不是 Bar 的成员。它是一种类型。 x 是 Foo 类型的成员。

但是即使写x(y),初始化的顺序也有问题。由于x 依赖于y,所以y 必须在x 之前初始化。所以在x之前声明y,保证初始化正确!

我建议进行此更改:

class Bar  
{
   public:
      baz y;
      Foo x; //NOTE : x declared after y, as x is depending on y!
      Bar() : x(y) {}
};

【讨论】:

    【解决方案2】:

    Bar 不是从Foo 派生的,它有一个名为x 的成员,类型为Foo,所以x 必须出现在mem-initializer-list中。

    Bar : x(y) {}
    

    但是,为了使其有效,y 的声明必须出现在 x 的定义中 class Bar 的声明之前,因为类成员的初始化顺序总是按照成员声明出现在类的定义中,如果您从 y 初始化 x,您将希望在 x 之前初始化 y。

    另外,请注意您在 class baz 的定义后缺少一个分号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多