删除默认构造函数头痛

时间:2013-01-28 14:56:59

标签: c++

我的c ++书中写道(lippman,c ++ primer,第五版,第508页):

  

如果类...具有const成员,其类型未明确定义默认构造函数,该成员没有类内初始值设定项,则合成的默认构造函数被定义为已删除。 (emphesis mine)

为什么这段代码会产生错误?

class Foo {
  Foo() { }
};

class Bar {
private:
  const Foo foo;
};

int main() {
  Bar f; //error: call to implicitly-deleted default constructor of 'Bar'
  return 0;
}

上面的规则似乎表明它不应该是一个错误,因为Foo确实明确定义了一个默认构造函数。有什么想法吗?

3 个答案:

答案 0 :(得分:7)

修复错误。你需要让Foo :: Foo()公开。

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

否则我相信它是私密的。

这是你想要的吗?

答案 1 :(得分:5)

当类构造不重要时,省略默认构造函数。

这通常意味着要么有一个显式构造函数接收参数(然后你不能假设它可以在没有这些参数的情况下构造)

或者,如果需要在构造中启动其中一个成员或基类(它们本身没有一个简单的构造函数)

答案 2 :(得分:1)

我认为这应该有用

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

class Bar {
public:
  Bar() : foo() {}
private:
  const Foo foo;
};