9

いくつかのパラメーターを受け取るコンストラクターが必要であり、これらのパラメーターを使用して、そのメンバー変数の値を計算できるとします。ただし、メンバー変数の値はパラメーターからの単純な割り当てではありません。メンバー変数の値として使用する前に、他のオブジェクトを作成し、値を変換する必要があります。

これは、イニシャライザ リストに詰め込みすぎです。また、変数を作成して再利用できないため、非常に非効率的です。そのため、コードをコピーして (同じオブジェクトの複数のコピーを作成して)、すべてのコードを初期化子リストに収める必要があります。

もう 1 つのオプションは、イニシャライザ リストを使用せず、デフォルトのコンストラクタを呼び出させ、コンストラクタ内の値を適切な計算で上書きすることです。

クラスにデフォルトのコンストラクターがない場合はどうなるでしょうか。どうすればこれをきれいに行うことができますか?

/* a class without a default constructor */
class A {
  public:
    B x1
    B x2
    A(B x1_, B x2_) : x1{x1_}, x2{x2_} {};
};

/* a class that contains an A object and needs to initialize it based on some complex logic */
class C {
  public:
    A a;
    C(D d) :
      a{b1,b2} // ultimately I just want to initialize a with two B objects
               // but unfortunatelly they require a lot of work to initialize
               // including instantiating other objects and using tons of methods
      {}
};
4

3 に答える 3

2

この場合、ポインターを使用します。例の修正版は次のとおりです。

//Class A is not modified
/* a class without a default constructor */
class A {
  public:
    B x1
    B x2
    A(B x1_, B x2_) : x1{x1_}, x2{x2_} {};
};



/* a class that contains an A object and needs to initialize it based on some complex logic */
class C {
  public:
    A* a;   // I declare this as a pointer
    C(D d)
      {
          // Perform all the work and create b1,b2
          a = new A(b1, b2);
      }

    ~C()    // Create a destructor for clean-up
    {
          delete a;
    }

};

new 演算子を使用すると、いつでもオブジェクトを初期化できます。また、オブジェクトはクラス スコープにあるため、デストラクタで削除します (クラス スコープの最後)。

于 2013-11-08T05:13:03.703 に答える