2

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

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

我想Object在我的Engine类中维护这个实例列表,但不需要该CreateObject(parameters)函数。我这样做的原因是我可以创建可以继承Object但仍被添加到此列表的新类。此列表的原因是(在Engine)我可以遍历Object已创建的每个实例。

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

4

4 回答 4

6

您可以在 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);
}
于 2013-08-02T11:07:39.267 回答
0

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

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

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

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

    ~Object
    {
       Engine::instance().releaseObject( this );
    }
};
于 2013-08-02T11:07:50.407 回答
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);
}
于 2013-08-02T11:09:00.480 回答
0

使用静态

    vector<Object*> Objects

Engine 类和静态公共函数中的变量

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

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

    Engine::Push(this)
于 2013-08-02T11:09:56.377 回答