是否有可能使用循环执行所有类型的类方法

问题描述:

我正在尝试编写一个tile引擎,并且在我的类中有一个方法,我需要一种方法来使用一个类循环来执行该类的所有现有实例的方法,例如,如果我有一个名为tile的GameObject,而另一个被调用的敌人则可以为它们两者调用GameObject :: render,而不必在循环?是否有可能使用循环执行所有类型的类方法

+2

你有一个包含所有这些对象的容器吗? – 2012-07-31 18:31:47

你必须做一些工作。例如,在您的GameObject类的构造函数中,您可以添加一个指向创建到列表的GameObject的指针。然后在你的析构函数中,你可以从同一个列表中删除指向被销毁对象的指针。这样你就可以获得所有现场游戏对象的指针列表,只要你感觉需要,你可以循环访问它们。

+0

所以我创建了一个GameObject类的向量,并且每当我添加一个新的GameObject时,我都会增加指针类的数量并将其设置为指向我喜欢的相同类型的任何东西?像:vector GOPointer;然后每当我创建一个新的GameObject时,我会推回GOPointer并在刚刚创建的GameObject上设置最新的指针? – TotalJargon 2012-07-31 18:50:58

+0

我想我遵循这个描述,但我不确定。但它必须是指针的列表(或向量),这非常重要。你不能把你创建的所有对象都放在对象矢量上,因为这样会创建更多的对象,所以你会陷入无限循环。另外一个向量或列表并不是最有效的方法,因为析构函数必须搜索整个列表(或向量)才能找到要删除的指针。所以你应该使用hash_set来做到这一点,特别是如果你创建的对象数量很大。 – jahhaj 2012-07-31 18:58:55

+0

我假设你可能知道没有Java hash_map的C++选择? – TotalJargon 2012-07-31 19:03:21

您要找的是observer pattern

基本上,你试图触发一个类的一些实例的事件。

您将有一个观察者类,您可以在其中注册要通知的类的所有实例(可能在构造函数中)。

class GamePublisher{ 
public: 
    void Attach(GameObject *); 
    void Detach(GameObject *); 
    void RenderGameObjects(); 
    static GamePublisher& GetPublisher(); 
} 

void GamePublisher::RenderGameObjects(){ 
//This is just an example for simplicity, the syntax my be a little off, assuming you have knowledge of functors. 
std::for_each(gameObjectContainer.begin(), gameObjectContainer.end(), render_functor); 
} 

//somewhere else... 
class GameObject{ 
    public: 
    virtual void Render()=0; 
} 

class Tile : public GameObject 
{ 
    public: 
    virtual void Render();//your implementation... 
    Tile(); 
} 

Tile::Tile() //: member initilizations...{ 
    GamePublisher::GetPublisher.Attach(this); 
} 

你将不得不处理连接/分离,并根据多线程将不得不拿出或重用机制,多线程之间处理这个。除此之外,我认为这会对你有用。祝你好运。

您可以从析构函数中处理Detaching。