0

それぞれ独自のコンストラクターを持ついくつかの派生クラスを持つクラスがあります。

class A
    {
    public:
       static A *create_new_A(int child_ID);

       member_data;
       void method();
    };

class A_child_0 : public A
    {
    A_child_0(int child_ID);
    //stuff
    };

class A_child_1 : public A
    {
    A_child_1(int child_ID);
    //stuff
    };
    etc...

そしてメインファイルでは、これらは次のようなもので呼び出されます:

A **array;
array = new A *[nchildren];
for (int i = 0 ; i < nchildren ; i++) 
    {
    array[i] = A->create_new_A( i );
    }

ここで、A は次のようなファクトリです。

A* A::create_new_A(int child_ID)
   {
   if (child_ID == 0) 
       {
       return new A_child_0(child_ID);
       }
   if (child_ID == 1)
       {
       return new A_child_1(child_ID);
       }  
   }

A_child_n のコンストラクターが呼び出されると、現在、派生クラス間でわずかに異なる member_data 値の初期化内に一連の手続き型コマンドがあります。

A_child_0(int child_ID)
    {
    member_data.vector1[0] = 0;
    for (i = 0; i < 200; i++)
         member_data.vector2[0] = i;
    read_in_conf_file("conf.txt") 
    // etc....
    }

A_child_1(int child_ID)
    {
    member_data.vector1[0] = 0;
    for (i = 0; i < 50; i++)
      member_data.vector2[0] = i*i;
    read_in_conf_file("conf.txt") 
     // etc....
    }

私が興味を持っているのは、これを行うためのより良い方法があるかどうかです。今、私はこれらの手続き的なステップの多くをカプセル化することを考えているので、次のようになります

A_child_0(int child_ID)
    {
    initializer_class *intializer;
    initializer->initialize(child_ID);
    }

A_child_1(int child_ID)
   {
   initializer_class *intializer;
   initializer->initialize(child_ID);
   }

また、さまざまなクラスの初期化手順を実装するクラス initializer() があります。これは大まかに戦略パターンに触発されていると思います。このアプローチが適切か賢明かについて、誰か提案はありますか? それとも、問題をイニシャライザ クラスに委ねて、複雑なレイヤーを追加するだけですか。このようなことをするのが悪い考えである場合、コンストラクターが 1 つの長い C プログラムにならないようにするにはどうすればよいでしょうか?

編集: ファクトリが正しく指定されていないことを指摘した人もいます。私が示した例ではまだあまり洗練されていませんが、以前のものほど的外れではありません。

4

3 に答える 3

1

std::generateを適切なジェネレーター ファンクターと組み合わせて見たいと思うかもしれません。ジェネレーターは、必要なデータを初期化するという大変な作業を行い、クラスのインターフェイスを比較的きれいに保つことができます (非公開にしたい場合は、ジェネレーターをクラスのフレンドとして持つ必要がある場合があります)。

于 2013-06-21T15:31:23.843 に答える
0

標準では、現在の「ソリューション」は形式が正しくありません。

ISO IEC 14882:2011、§12.1/10

コンストラクターには、戻り値の型 (void でさえも) を指定してはなりません。コンストラクター本体の return ステートメントは、戻り値を指定してはなりません。コンストラクターのアドレスは使用されません。

別の工場パターンが必要です。

おそらく、ここから何かを使用することができます:シンプルな C++ オブジェクト ファクトリを設計するには?

于 2013-06-21T15:33:59.087 に答える