-1
#include <fstream>
using namespace std;
ofstream out("order.out");

#define CLASS(ID) class ID { \
public: \
  ID(int) { out << #ID " constructor\n"; } \
  ~ID() { out << #ID " destructor\n"; } \
};

CLASS(Base1);
CLASS(Member1);
CLASS(Member2);
CLASS(Member3);
CLASS(Member4);

class Derived1 : public Base1 {
  Member1 m1;
  Member2 m2;
public:
  Derived1(int) : m2(1), m1(2), Base1(3) {
    out << "Derived1 constructor\n";
  }
  ~Derived1() {
    out << "Derived1 destructor\n";
  }
};

class Derived2 : public Derived1 {
  Member3 m3;
  Member4 m4;
public:
  Derived2() : m3(1), Derived1(2), m4(3) {
    out << "Derived2 constructor\n";
  }
  ~Derived2() {
    out << "Derived2 destructor\n";
  }
};

int main() {
  Derived2 d2;
}

「コンストラクターはデフォルトのコンストラクターではないことに注意してください。それぞれにint引数があります。引数自体には識別子がありません。存在する唯一の理由は、初期化子リストでコンストラクターを明示的に呼び出すように強制することです。

4

3 に答える 3

1

クラスにはユーザー定義のコンストラクターがあり、そのユーザー定義のコンストラクターはデフォルトのコンストラクターではないため、これらのクラスで使用できるデフォルトのコンストラクターはありません。

これにより、派生クラスのメンバー初期化子リストで使用可能なコンストラクターの1つを明示的に指定する必要があります。

class Derived : public Base {
  Derived() {} // fails to compile, no constructor Base::Base() available
  Derived() : Base(3) {} // works
};

コードが何をするのか、そしてそれがどのようにそれを達成するのかについてはこれだけです。なぜあなたがそのようなものを必要とするのか私には分かりませんが、あなたは決して知りません。

于 2012-01-21T23:50:17.990 に答える
0

これは、引数に識別子(名前)がないため、コンストラクターのどこにも使用されないことを意味します。

ただし、派生クラスに属するオブジェクトを作成すると、そのコンストラクターが親クラスのコンストラクターを呼び出します。また、オブジェクトメンバーがある場合は、コンストラクターで初期化する必要があります。

親クラスにデフォルト(引数なし)のコンストラクターがある場合は、それを呼び出す必要はまったくありません。自動的に実行されます。また、オブジェクトメンバーを初期化しない場合は、デフォルトのコンストラクターを介して自動的に初期化されます。

どのクラスにも実際にはデフォルトのコンストラクターがないため、親クラスコンストラクターを明示的に呼び出す必要があります。また、1つの引数を使用して既存のコンストラクターのみを介してメンバーを初期化する必要があります。

すべてのクラスで名前のない引数を使用すると、まさにそれが実行されます。呼び出されるデフォルトのコンストラクターに依存するのではなく、コンストラクターを明示的に呼び出す必要があります。

于 2012-01-21T23:53:05.620 に答える
0

引数を取るコンストラクターを提供すると、コンパイラーがデフォルトのコンストラクターを合成できなくなります。これにより、クラスのユーザーは、このクラスのインスタンスを作成するときに、破棄IDされるを提供するように強制されます。int私はこのアプローチの実際的な適用を見ることができません。

このデモコードを簡略化するには:

#include <iostream>

struct ID
{
    ID(int)
    {
        std::cout << "ID  constructor" << std::endl;
    }
};

int main()
{
    ID this_will_compile(0);
    ID this_will_not_compile;
}

のインスタンスの最初の作成はID成功しますが、2回目の試行は失敗します。コンパイラは次のようなことを教えてくれます:

エラー:「ID :: ID()」の呼び出しに一致する関数がありません</ p>

そのようなクラスから派生する場合も同じです。

これはうまくいくでしょう...

struct DerivedWorking: public ID
{
    DerivedWorking()
        :ID(0)
    {
    }
};

intこれはそうではありませんが、 toIDのコンストラクターを提供しないため...

struct DerivedBroken: public ID
{
    DerivedBroken()
    {
    }
};
于 2012-01-22T00:24:27.063 に答える