0

オブジェクトのリスト objA があるとします。これで、objA はより多くの objA を作成できるようになり、それらは互いに完全に無関係になります。他の objA の存在について少しでも知る必要はありません。objA をスポナー内に保存せずに、別の objA によって作成された objA を取得するにはどうすればよいですか? objA のリストを表すためにシングルトンを使用したくありません。

例:

class Container
{  
     list<Monster*> listOfMonsters;

     void UpdateAllMonsters()
     {
          foreach(Monster monster in listOfMonsters)
          {
              monster.Update();
          }
     }         

};

class Monster
{
    void Update()
    { 
         new Monster();
    }
};

Update() メソッドで作成された Monster を取得し、Containers listOfMonsters に貼り付けるにはどうすればよいですか? コンテナ オブジェクトのインスタンスを 1 つだけ浮かせておきたいのですが、モンスターがコンテナ オブジェクトに対して何もできないようにする必要があります。

私が考えた1つの解決策は、コンテナとモンスターの間に中間オブジェクトを作成することです。これにより、コンテナオブジェクトのインスタンスは1つだけになり、モンスターは基本的にコンテナオブジェクトの1つのメソッドにしかアクセスできなくなります(これはlistOfMonsters)。

IE;

class Container
{  
     list<Monster*> listOfMonsters;

     void UpdateAllMonsters()
     {
          foreach(Monster monster in listOfMonsters)
          {
              monster.Update();
          }
     }         

     void AddToList(Monster* monster)
     {
         listOfMonsters.add(monster);
     }


};


class ContainerLiason
{
     private __Container*;

     AddToContainer(Monster* monster)
     {
         __Container.AddToList(monster);
     }
};

class Monster
{

    private ContainerLiason* __liason;
    void Update()
    { 
         __liason.AddToContainer(new Monster());
    }
};

他のアイデアやデザインパターンはありますか? もう1つ、上記の例はデザインパターンの一種で、そうであれば何と呼ばれますか? シングルトンが何と呼ばれているか、またはそれが何であるかを知る前にシングルトンを使用したので、私はただ尋ねます。

4

3 に答える 3

2

ファクトリ パターンは、必要なことを行う必要があります。コンテナ (別名ファクトリ) は、作成されたオブジェクトのリストを保持するだけでなく、オブジェクトの作成自体も処理します。

class Factory {  
  list<shared_ptr<Monster>> listOfMonsters;
public:
  void UpdateAllMonsters() {
    for(auto pMonster : listOfMonsters)  {
      monster->Update();
    }
  }         

  shared_ptr<Monster> createMonster() {
    auto newMonster = make_shared<Monster>();
    listOfMonsters.push_back(newMonster);
    return newMonster;
  }
};

class Monster {
  shared_ptr<Factory> theFactory;
public:
  void Update() { 
    auto newMonster = theFactory->createMonster();
    // ...
  }
};

C++タグの下で質問したことにも注意してください-あなたのコードは実際にはそうではありません

于 2013-06-12T09:51:38.847 に答える
1

すべてのモンスターが ContainerLiaison に同じポインターを持っていることを確認する必要があるだけです。必要に応じて参照を使用できます。

別の解決策は、各モンスターのコンテナを参照することですが、ContainerLiason の方が優れていると思います。

最後の解決策は静的要素と関数ですが、私はそれが好きではありません。

解決策を保持することをお勧めします

于 2013-06-12T09:51:20.860 に答える
0

わかりましたので、ここでシングルトンを使用する必要はありません。最も単純なオプションはUpdate、パラメータとして MonsterContainer を参照することです。

class Container
{  
     using MonsterList = list<Monster*>; // you should use a shared container or shared_ptrs here instead I think.
     MonsterList listOfMonsters;

     void UpdateAllMonsters()
     {
          foreach(Monster monster in listOfMonsters)
          {
              monster.Update(listOfMonsters);
          }
     }         

};

class Monster
{
    // You should change the name of your function here. Update does not imply
    // creation to me. I would call it "CreateMonsterInList"
    void Update(MonsterList& monsterContainer)
    { 
         monsterContainer.add( new Monster() );
    }
}
于 2013-06-12T09:51:29.440 に答える