在我的C ++项目中,我有一个Engine
类和一个Object
类。
我的问题在于如何创建Object
的实例。目前,这是通过在CreateObject(parameters)
类中使用Engine
函数来完成的。这会向Object
个std::vector
个实例添加Object
的新实例。
我想在Object
课程中维护此Engine
的实例列表,但不需要CreateObject(parameters)
函数。我的理由是,我可以创建可以从Object
继承的新类,但仍然可以添加到此列表中。这个列表的原因是(在Engine
中)我可以迭代已经创建的每个Object
实例。
这最终意味着我使用Object
之类的东西创建Object newObject = Object(parameters);
个实例,但仍然让Engine
类维护所有Object
个实例的列表,而不是需要Object
引用Engine
的实例或列表以将其自身添加到此列表中(如Object
的实例中不应该知道它所在的列表)。 可以这样做吗?
答案 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)