0

異端児について質問です。

クラスを宣言してから、以下のように子クラスを宣言します

`Producer::Producer(Pool<string>* p, string id) {
    mPool = p;  // protected members
    mId = id;
}

ProduceCond::ProduceCond(Pool<string>* p, string id) {
    Producer(p, id);
}

class Producer{
}

class ProduceCond : public Producer, public ThreadSubject {
}

`

子コンストラクターで右の親コンストラクターを呼び出しましたが、エラーが発生します

ProduceCond.cpp:10:52: error: no matching function for call to ‘Producer::Producer()’

親の正しいコンストラクター形式を使用しているのに、なぜこのエラーが発生するのか教えてもらえますか?

4

2 に答える 2

2

コンストラクターの初期化リストを使用する必要があります。

ProduceCond::ProduceCond(Pool<string>* p, string id)  : Producer(p, id)
{
  ....
}

それ以外の場合は、デフォルトで a を構築しProducer(デフォルトのコンストラクターがないため、これはできません)、コンストラクターの本体で奇妙なことを行っています。

于 2013-07-14T10:49:16.327 に答える
1

デフォルトのコンストラクターを持たないサブオブジェクト(ベース) を初期化するには、メンバー初期化リストを介して呼び出す必要があります。

ProduceCond::ProduceCond(Pool<string>* p, string id) : Producer(p, id) {}

または、サブクラスのコンストラクターによって暗黙的に呼び出されるデフォルトのコンストラクターを提供することもできます

Producer() : mPool(std::nullptr) { } 

また、以下の条件ではメンバー初期化子を使用する必要があります。

1 You must (at least, in pre-C++11) use this form to initialize a nonstatic const data
member.

2 You must use this form to initialize a reference data member.
于 2013-07-14T10:53:53.053 に答える