gpt4 book ai didi

c++ - 模板和惰性初始化

转载 作者:行者123 更新时间:2023-11-28 00:41:18 24 4
gpt4 key购买 nike

我有一个 UIManager,它管理一系列继承自单个 UI 类的类。目前,它的工作原理是这样的,其中各个 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),它允许您以一致的方式将实例化接口(interface)映射到它们的类型。

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;
}
}

最佳答案

目前,您只能为每种类型的一个 UI 元素分配存储空间。保持该原则但拥有任意数量的窗口从根本上说是不可能的。

快速而肮脏的解决方案是为窗口号添加一个模板参数。如果这是一款游戏,并且您的玩家数量有限,您可以为一些预定数量的窗口进行静态存储。

template <typename T, int N>
T *getUI()

不过,将 UI 身份绑定(bind)到类型系统的方法存在根本性缺陷,我会推荐使用多态性和容器的更传统的方法。


一种按类型识别对象并动态存储它们的方法可能看起来像

class UIManager {
std::map< std::type_index, std::unique_ptr< UIBase > > elements;

template< typename T >
T & GetUI() { // Return reference because null is not an option.
auto & p = elements[ typeid( T ) ];
if ( ! p ) p.reset( new T );
return dynamic_cast< T & >( * p );
}
}

请注意,这需要 UIBase 有一个虚拟析构函数,否则当您退出时对象将不会正确终止。

关于c++ - 模板和惰性初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18730073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com