这个问题源于这个问题的结果: 如何自动维护类实例列表?
参考上一个问题,我创建了我的静态对象列表static std::set< Object* > objects;
但是,为了避免 and 之间的循环引用Engine
,Object
我将其移出Engine
并移入单独的头文件中。然后我意识到,我可以使用一堆静态访问器,而不是直接与列表交互。这样,如果有任何东西对列表进行更改,我总是可以打破这些功能。
这样做还有其他好处吗?或者这是一个不好的方法? 我从不打算实例化ObjectManager
——我是否应该使用我认为所谓的“自由函数”来管理这个std::set
,而不用上课?
我创建了一个测试项目,以使测试变得简单。该类Inheritor
继承自Object
该类。该类的代码ObjectManager
(由 引用Main.cpp
,在本例中Object
,Inheritor
但在我的主项目中将使用非常相似的代码)如下:
对象管理器.h:
#include <set>
class ObjectManager
{
friend class Object;
friend class Inheritor;
public:
static int ObjectCount();
static void AddObject(Object *);
static void RemoveObject(Object *);
static int InheritorCount();
static void AddInheritor(Inheritor *);
static void RemoveInheritor(Inheritor *);
static std::set<Object *>::iterator GetObjectListBegin();
static std::set<Object *>::iterator GetObjectListEnd();
static std::set<Inheritor *>::iterator GetInheritorListBegin();
static std::set<Inheritor *>::iterator GetInheritorListEnd();
private:
ObjectManager();
~ObjectManager();
};
对象管理器.cpp:
#include "ObjectManager.h"
static std::set<Object *> objectList;
static std::set<Inheritor *> inheritorList;
ObjectManager::ObjectManager()
{
}
ObjectManager::~ObjectManager()
{
}
int ObjectManager::ObjectCount()
{
return objectList.size();
}
void ObjectManager::AddObject(Object *input)
{
objectList.insert(input);
}
void ObjectManager::RemoveObject(Object *input)
{
objectList.erase(input);
}
int ObjectManager::InheritorCount()
{
return inheritorList.size();
}
void ObjectManager::AddInheritor(Inheritor *input)
{
inheritorList.insert(input);
}
void ObjectManager::RemoveInheritor(Inheritor *input)
{
inheritorList.erase(input);
}
std::set<Object *>::iterator ObjectManager::GetObjectListBegin()
{
return objectList.begin();
}
std::set<Object *>::iterator ObjectManager::GetObjectListEnd()
{
return objectList.end();
}
std::set<Inheritor *>::iterator ObjectManager::GetInheritorListBegin()
{
return inheritorList.begin();
}
std::set<Inheritor *>::iterator ObjectManager::GetInheritorListEnd()
{
return inheritorList.end();
}
**
编辑:
** 我已经重写了我的代码以消除对 ObjectManager 的需求。
而不是使用ObjectManager
,我想要一个列表的每个类都包含其源文件中的静态列表,因此Object.cpp
containsstatic std::set<Object *> objectList;
和Inheritor.cpp
contains static std::set<Inheritor *> inheritorList;
。
然后,这两个类中的每一个都包含一个静态Count()
函数,用于获取其各自列表中的项目数,GetListBegin()
以及GetListEnd()
获取集合的开头和结尾。
由于函数在基类和派生类中共享相同的名称,因此Object::Count()
获取其各自列表中的实例数Object
,并Inheritor::Count()
获取Inheritor
其各自列表中的实例数。
我不知道这是否是一种不好的做法。在每个相应的类之外,没有任何东西可以从列表中添加或删除。我唯一的问题是我不确定如何阻止静态函数在任何东西中可用,Inheritor
例如继承自。