【问题标题】:Is it possible to use a loop to perform a class method on all of it's type是否可以使用循环对其所有类型执行类方法
【发布时间】:2012-07-31 18:28:49
【问题描述】:

我正在尝试编写一个磁贴引擎,并且我的一个类中有一个方法,我需要一种能够使用一个循环来为该类的所有现有实例执行该方法的方法,例如,如果我有一个名为 tile 的 GameObject,另一个名为enemy 是否有一种方法可以为它们两者调用 GameObject::render 而无需在循环中指定它们的名称?

【问题讨论】:

  • 你有一个包含所有这些对象的容器吗?

标签: c++ class methods for-loop foreach


【解决方案1】:

您正在寻找的是observer pattern

基本上,您是在尝试为一个类的多个实例触发一个事件。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 所以我创建了一个 GameObject 类的向量,每当我添加一个新的 GameObject 时,我都会增加指针类的数量并将其设置为指向我喜欢的任何相同类型的对象?比如:vector GOPointer;然后每当我创建一个新的游戏对象时,我都会推回 GOPointer 并在我刚刚创建的游戏对象上设置最新的指针?
    • 我想我遵循那个描述,但我不确定。但是它必须是一个指针列表(或向量),这非常重要。您不能将您创建的所有对象放在对象向量上,因为这样做会创建更多对象,因此您将进入无限循环。此外,向量或列表也不是最有效的方法,因为析构函数必须搜索整个列表(或向量)才能找到要删除的指针。所以你真的应该用 hash_set 来做这件事,尤其是当你创建的对象数量很大时。
    • 我假设您可能知道的 Java hash_map 没有 C++ 替代品?
    • C++ 有 hash_map 和 hash_set。但它们不在以前的 C++ 标准中,因此对它们的支持通常是一种扩展,但我认为所有主要编译器都以某种方式支持它们。
    • 所以,我可以使用:vector GOList 或 hash_map,谢谢 :)
    【解决方案3】:
    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);
    }
    

    您将不得不处理附加/分离,并且取决于多线程将不得不提出或重用一种机制来在多个线程之间处理此问题。除此之外,我认为这对你有用。祝你好运。

    您可以处理与析构函数的分离。

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2020-11-08
      • 2021-08-31
      • 1970-01-01
      • 2023-03-14
      • 2023-04-03
      相关资源
      最近更新 更多