5

私の c++ の本には次のように書かれています (lippman、c++ 入門書、第 5 版、p. 508)。

合成されたデフォルト コンストラクターは、クラス ... に、デフォルト コンストラクターを明示的に定義しない型の const メンバーがあり、そのメンバーにクラス内初期化子がない場合、削除済みとして定義されます。(強調鉱山)

では、なぜこのコードでエラーが発生するのでしょうか?

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 がデフォルトのコンストラクターを明示的に定義しているため、エラーであってはならないことを示しているようです。何か案は?

4

3 に答える 3

7

エラーを修正するには。Foo::Foo() を公開する必要があります。

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

そうでなければ、それは私的なものだと思います。

これはあなたが探しているものですか?

于 2013-01-28T15:02:20.173 に答える
5

クラスの構築が自明でない場合、デフォルトのコンストラクターは省略されます。

これは一般に、パラメーターを受け取る明示的なコンストラクターがあることを意味します (そして、それらのパラメーターなしで構築できるとは想定できません)。

または、メンバーまたは基本クラスの 1 つを構築時に開始する必要がある場合 (それら自体には自明なコンストラクターがありません)。

于 2013-01-28T15:05:22.600 に答える
1

これはうまくいくはずだと思います

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

class Bar {
public:
  Bar() : foo() {}
private:
  const Foo foo;
};
于 2013-01-28T15:02:54.663 に答える