2

私の C++ プロジェクトには、EngineクラスとObjectクラスがあります。

私の問題は、インスタンスのObject作成方法にあります。現在、これはクラスCreateObject(parameters)内の関数を使用して行われます。これにより、 の新しいインスタンスがのEngineインスタンスに追加Objectされます。std::vectorObject

クラスObject内のインスタンスのこのリストを維持したいのですが、関数は必要ありません。この理由は、継承できるがこのリストに追加できる新しいクラスを作成できるようにするためです。このリストの理由は、( で) 作成されたすべてのインスタンスを繰り返し処理できるようにするためです。EngineCreateObject(parameters)ObjectEngineObject

これは最終的に、のObjectようなものでインスタンスを作成することを意味しますObject newObject = Object(parameters);が、 のインスタンスを参照したり、このリストに自身を追加するためのリストを参照したりする必要なく、Engineクラスにすべてのインスタンスのリストを保持させます ( shouldのインスタンスのように)。それが入っているリストについては知りません)。 これはできますか?ObjectObjectEngineObject

4

4 に答える 4

6

Engine クラスで静的コレクション データ メンバーを定義し、Object コンストラクターとデストラクターで更新できます。

class Engine
{
    friend class Object;
...
public:
    static std::set< Object* > m_instances;
};

class Object
{
public:
    Object();
    virtual ~Object();
    ...
};

コンストラクタでインクリメントし、デストラクタでデクリメントします。

Object::Object()
{
    Engine::m_instances.insert(this);
}

Object::~Object()
{
    Engine::m_instances.erase(this);
}
于 2013-08-02T11:07:39.267 に答える
0

あなたのファクトリーパターンアプローチはこれを達成するための良い方法だと思います. エンジンは、オブジェクトのすべてのインスタンスを内部で管理します。

ただし、エンジンによっても管理される外部インスタンスを作成する場合は、エンジンのインスタンスにアクセスする必要があります。そのインスタンスがグローバル変数であっても、Engine クラスがシングルトン パターンを実装していても。

それを行うための 2 番目に優れた方法 (最初の方法はまだ行っていないこと、ファクトリです) は、エンジンにシングルトンを実装することだと思います。

class Object
{
    Object
    {
        Engine::instance().addObject( this ); //Note that engine stores pointers. STL containers cannot store references.
    }

    ~Object
    {
       Engine::instance().releaseObject( this );
    }
};
于 2013-08-02T11:07:50.407 に答える
0

多くの人が言及しているように、ファクトリ アーキテクチャは適切でクリーンな方法です。それ以外の場合は、グローバル インスタンス、静的メンバー、またはシングルトンが必要になります。ただし、静的なアプローチはObjectfriendクラス エンジンを作成し、メンバーを静的にすることです。

class Engine{
     friend class Object;

     private:
     static std::vector <Object*> objectList;
};

これにより、オブジェクトはエンジンのプライベート メンバーに静的にアクセスできます。次に、Object のコンストラクターで、次のようにリストに追加します。

Object::Object(int randomparam1, const char* randomparam2)
{
    Engine::objectList.push_back(this);
}
于 2013-08-02T11:09:00.480 に答える
0

スタティックを使用する

    vector<Object*> Objects

Engine クラスの変数と static public 関数

    Push(Object* obj) { Objects.push_back(obj); }

オブジェクトをリストにプッシュします。次に、 Object クラスのコンストラクターで呼び出します

    Engine::Push(this)
于 2013-08-02T11:09:56.377 に答える