0

複数の幾何学的プリミティブ型(すべて基本Primitiveクラスを継承)がクラスのオブジェクトに格納されるアプリケーションを設計していますScene

main()プリミティブを作成してから呼び出すことでプログラムでシーンを作成する関数を使用する代わりに、Scene::add(...)実行時に読み取られるある種の構成ファイルが必要です。
これにより、シーンについて何かを変更するたびに再コンパイルする必要がなくなり、一般的なアイデアのように見えます(プログラムできない人がいつか私のプログラムを使用する必要がある場合に備えて)

私は次の.iniようなファイルを介してシーンを定義する小さなスキームを考案しました:

[primitivefoo]
type = sphere
pos = 10 20 30
radius = 5.5

[primitivebar]
type = triangle
vertexA = 10 10 -10
vertexB = ...
...

あなたはその考えを理解します。

私の計画は、クラスの各サブクラスにPrimitive独自のメソッドを登録させることです。ファイルのどのタイプ文字列が。のどのサブクラスに対応するかがわかるように、 ->をマップするある種のマップが必要になります。interpretINI(...)SceneScenestringvoid* (...).iniPrimitive

このアプローチ全体が悪い設計であり、私が達成したいことを達成するためのはるかにエレガントな方法がすでにある場合は、それを聞いてみたいと思います。そうでなければ、誰かが私のデザインを実現するのを手伝ってくれたらとてもありがたいです。Primitiveすべてのサブクラスを反復処理して、サブクラスに登録させる方法に固執していますScene...

4

1 に答える 1

3

Primitive*あなたのアプローチは私には良いように思えますが、名前は(の代わりに) を返す関数にマップする必要がありますvoid*。これは工場パターンです (2 つのレベルで)

このアプローチの 1 つの制限は、登録されたファクトリ関数が同じ数/型のパラメーターを受け入れる必要があることです。[更新: あなたの質問に対するあなたのコメントを読んだ上で、これはあなたのケースでは問題にならないはずです]。

特定のクラスのサブクラスを自動的に列挙する方法を知りません。既知のクラスを手動で登録する必要があります (メインまたは特別なregister関数で) 。

更新:問題のクラスに固有の「登録」機能を実行する静的変数(クラス内またはそれ以外)を使用して、サブクラスの列挙を回避できます。

class MyShape : public Shape
{
  static int reg;
  // appropriate constructor
};

int registerMyShape();

int MyShape::reg = registerMyShape(); // this will be called at program startup

唯一の問題は、個別のコンパイル単位で静的な初期化順序が保証されないことです。おそらく、形状をモジュールのようにして、レジストリ クラスが完全に初期化された後にそれらを「ロード」することができますか?

于 2012-05-24T10:31:38.057 に答える