0

コンストラクターでフィールドの初期化を無効にすることは可能ですか?クラスのコンストラクターがこのクラスのフィールドのコンストラクターを呼び出さないようにするには、mallocを使用せずにそれを行うにはどうすればよいですか?次のようなコードで二重初期化を回避するためにこれを実行したいと思います。

class A() {
   A(int n): N(n) {}
}

class B() : public A() {
    B(int n) : A(n) {}
    B() {
        new(this) B(42);
    }
}
4

2 に答える 2

1

私はあなたの質問を理解していると思います、あなたは欲しいですDelegating Constructors、しかしこれはC++11でのみ利用可能です

class Notes {
  int k;
  double x;
  std::string st;
public:
  Notes();
  Notes(int);
  Notes(int, double);
  Notes(int, double, std::string);
};

Notes::Notes(int kk, double xx, std::string stt) : k(kk),
  x(xx), st(stt) {/*do stuff*/}
Notes::Notes() : Notes(0, 0.01, "Oh") {/* do other stuff*/}
Notes::Notes(int kk) : Notes(kk, 0.01, "Ah") {/* do yet other stuff*/ }
Notes::Notes( int kk, double xx ) : Notes(kk, xx, "Uh") {/* ditto*/ }
于 2013-01-19T11:11:54.697 に答える
1

簡単に言えば、できません。メンバーの構成員は常に呼ばれます。そして、それは良いことです。なぜなら、オブジェクトの実行可能な部分が欠落している場合、オブジェクトは構築されないからです。実行可能とは、オプションではなく、という意味です。C ++のオプションは、ポインターまたはboost::optionalコメントで提案されているように表現する必要があります。

さらに、オブジェクトを2回初期化するため、コンストラクター内でこれに新しい配置を呼び出すと、言語犯罪になります。簡単に言うと、ここでは、疑わしく、エラーが発生しやすく、理解して維持するのが難しいオブジェクトの存続期間をいじっています。

あなたが探していることは、C++03では単純に不可能です。ただし、C ++ 11で可能なことは、いわゆる委任コンストラクターです。これは、おそらくあなたが探しているものです。

class B() : public A() {
    B(int n) : A(n) {}
    B() : B(42) //delegate the default ctor to the int ctor
    { /* do more stuff*/ } 
}

ただし、それらを使用してすべてを実行することはできません。同じクラスの別のコンストラクターを呼び出すことができます。

于 2013-01-19T11:15:50.410 に答える