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

时间:2013-08-02 11:01:33

标签: c++ list class instance stdvector

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

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

我想在Object课程中维护此Engine的实例列表,但不需要CreateObject(parameters)函数。我的理由是,我可以创建可以从Object继承的新类,但仍然可以添加到此列表中。这个列表的原因是(在Engine中)我可以迭代已经创建的每个Object实例。

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

4 个答案:

答案 0 :(得分:4)

您可以在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);
}

答案 1 :(得分:0)

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

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

第二个最好的方法(第一个是yoa还是doint,工厂),我认为是在引擎中实现单例:

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

    ~Object
    {
       Engine::instance().releaseObject( this );
    }
};

答案 2 :(得分:0)

就像许多人提到的那样,工厂架构是一种很好而且干净的方式,否则你将不得不拥有一个全局实例,静态成员或单例。但是,静态的方法是 使Object成为friend类引擎,并使成员保持静态:

class Engine{
     friend class Object;

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

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

Object::Object(int randomparam1, const char* randomparam2)
{
    Engine::objectList.push_back(this);
}

答案 3 :(得分:0)

使用静态

    vector<Object*> Objects
Engine类和静态公共函数中的

变量

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

将对象推送到列表中。然后在Object类的构造函数中调用

    Engine::Push(this)