我有一个UIManager来管理从一个UI类继承的一系列类。目前,它的工作原理是这样的,其中单个用户界面懒洋洋地初始化,静态存储:模板和延迟初始化
class UIManager
{
public:
UIManager(); // Constructor
virtual ~UIManager(); // Destructor
template <typename T>
T *getUI()
{
static T ui(); // Constructs T, stores result in ui when
// getUI<T>() is first called
return &ui;
}
}
一个名为:
getUI<NameEntryUI>()->activate();
或
getUI<MenuUI>()->render();
我正在考虑设计改变这将允许我有多个玩家,因此不止一个游戏窗口,因此不止一个UIManager。当UIManager被删除时,我希望所有构建的ui对象都被清除(目前,因为ui对象是静态的,它们会一直存在,直到程序退出)。
如何重写上面的内容以在UIManager被终止时删除ui对象?
======================================
下面是解我已经实施。早期的结果是它运行良好。
基本上,我从Potatoswatter建议的想法开始,我喜欢这个想法,因为它与我之前开始的方法相似,因为我不知道typeid(T)。我向后移植了代码以仅使用C++ 98功能。整个事情的关键是typeid(T),它允许您以一致的方式将实例化的接口映射到它们的类型。
class UIManager
{
typedef map<const char *, UserInterface *> UiMapType;
typedef UiMapType::iterator UiIterator;
map<const char *, UserInterface *> mUis;
public:
UIManager(); // Constructor
virtual ~UIManager() // Destructor
{
// Clear out mUis
for(UiIterator it = mUis.begin(); it != mUis.end(); it++)
delete it->second;
mUis.clear();
}
template <typename T>
T *getUI()
{
static const char *type = typeid(T).name();
T *ui = static_cast<T *>(mUis[type]);
if(!ui)
ui = new T();
mUis[type] = ui;
return ui;
}
}
存储'std :: shared_ptr'将意味着类型不需要公共基类或虚拟析构函数 –
@JonathanWakely虽然没有共享,但会有点滥用。严重的是,没有多态的UI是疯狂的。如果没有虚拟方法来绘制和响应点击,至少,程序组织有一些非常错误的地方。 – Potatoswatter
正如我在我的问题中所述,我所有的UI对象都是从一个共同的父对象继承而来的(在这里没有任何问题:-)。我试图创建一个这样的地图,但没想到使用unique_ptr。唯一的缺点是unique_ptr是一个C++ 11项目,我们还没有完全接受。 – Watusimoto