首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何自动维护类实例列表?

如何自动维护类实例列表?
EN

Stack Overflow用户
提问于 2013-08-02 11:01:32
回答 4查看 3.8K关注 0票数 2

在我的C++项目中,我有一个Engine类和一个Object类。

我的问题在于如何创建Object实例。目前,这是通过在CreateObject(parameters)类中使用Engine函数来完成的。这将Object的一个新实例添加到std::vector of Object实例中。

我希望在我的Object类中维护这个Engine实例列表,但不需要CreateObject(parameters)函数。我之所以这样做是因为我可以创建新的类,这些类可以继承Object,但仍然可以添加到这个列表中。这个列表的原因是为了(在Engine中)我可以迭代已经创建的每个Object实例。

这最终意味着我使用类似于Object的东西来创建Object newObject = Object(parameters);实例,但是仍然让Engine类维护一个包含所有Object实例的列表,而不需要Object引用Engine的实例或将自己添加到这个列表中的列表(就像Object的实例不应该知道它在其中的列表一样)。,可以这样做吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-02 11:07:39

您可以在引擎类中定义静态集合数据成员,在对象构造函数和析构函数中更新它:

代码语言:javascript
复制
class Engine
{
    friend class Object;
...
public:
    static std::set< Object* > m_instances;
};

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

在构造函数中增加它,在析构函数中减少它。

代码语言:javascript
复制
Object::Object()
{
    Engine::m_instances.insert(this);
}

Object::~Object()
{
    Engine::m_instances.erase(this);
}
票数 6
EN

Stack Overflow用户

发布于 2013-08-02 11:07:50

我认为你的工厂模式方法是实现这一目标的好方法。引擎在内部管理对象的所有实例。

但是,如果您想要创建由引擎管理的外部实例,则必须访问引擎的实例;即使该实例是全局变量,即使引擎类实现了单例模式也是如此。

要做到这一点,第二个最好的方法是(第一种方法是yoa是什么,工厂),我认为是在引擎中实现一个单例:

代码语言:javascript
复制
class Object
{
    Object
    {
        Engine::instance().addObject( this ); //Note that engine stores pointers. STL containers cannot store references.
    }

    ~Object
    {
       Engine::instance().releaseObject( this );
    }
};
票数 0
EN

Stack Overflow用户

发布于 2013-08-02 11:09:00

正如许多人提到的那样,工厂架构是一种很好的、干净的方法,否则您就必须拥有一个全局实例、静态成员或单个实例。但是,一种静态方法是使Object成为类引擎的friend,并使成员保持静态:

代码语言:javascript
复制
class Engine{
     friend class Object;

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

这将允许对象静态地访问引擎的私有成员。然后,在Object的构造函数中,将其添加到列表中,如下所示:

代码语言:javascript
复制
Object::Object(int randomparam1, const char* randomparam2)
{
    Engine::objectList.push_back(this);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18015276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档