7

コンストラクターが複数のパラメーターを取る自分のクラスにクラス A のメンバーがあります。自分のクラスのパラメーターをクラス A のコンストラクターに転送しています。しかし、これらのパラメーターが正しいことが重要なので、A のメンバーを構築する前に確認する必要があります。問題は次のとおりです。メンバーのメンバーを除外できます初期化リスト、デフォルトのコンストラクターを効果的に呼び出します。コンストラクターでのチェックの後、代入で A のコンストラクターを呼び出すことができます。ただし、 A のデストラクタがプライベートであるため、これはエラーを生成します。

どうすればこれを解決できますか?

MyClass::MyClass(int someParam) : otherMember(2){
//checks for someParam
member = A(someParam); // <- produces error
}
4

2 に答える 2

10

何をするにしても、アクセス可能なデストラクタが必要になります。しかし、あなたの質問に対処するための 1 つのオプションは、静的関数を呼び出して、初期化子内からパラメーターをチェックすることです。

class MyClass {
  private:
    static void checkParam(int);
// ...
};

MyClass::MyClass(int someParam) : otherMember( (checkParam(someParam), 2) ) {
  // ...
}

static void MyClass::checkParam(int someParam) {
  if (...) throw someException();
}

そこで使用されているのは、引数区切り記号ではなくコンマ演算子であることに注意してください。,これは、左と右の両方の式を評価し、左の結果を破棄します。

于 2012-01-01T23:27:56.233 に答える
0

これにアプローチするには2つの方法があります。

  1. クラスAがパラメーターなしのコンストラクターで使用できることを確認someParamし、別のメソッドで設定します。A.SetSomeParam(someParam)

  2. から継承するAのではなく、タイプ のメンバー オブジェクトを保持し、Aいつでも好きなときに構築できます。

于 2012-01-01T23:29:42.363 に答える