【发布时间】:2011-07-30 07:59:38
【问题描述】:
我想在游戏中实现 Memento 模式以实现检查点。
我有一个游戏中的 GameObject 指针列表。 GameObject是一个抽象类,由StaticObject、AnimatedObject等类实现...
我想让我的 Memento 类尽可能抽象,所以我已经对我的整个 Memento 系统进行了模板化。
我的(非常准系统,用于调试目的)Memento 类是;
template<class T>
class Memento
{
public:
Memento() { }
Memento(T data)
{
setData(data);
}
void setData(T data)
{
//wanting this function to do complex behaviour
}
T _state;
};
稍后我会加入逻辑来区分 T 是否为指针。
_state 需要是实际 GameObject 副本的指针,而不仅仅是指针本身的副本,因为这违背了 Memento 的目的。
我想在 Memento 模板中做的过程是;
1) 传入指向抽象基类的指针。
2) 确定它指向的子类的类型(在运行时)。
3) 在堆上新建一个子类,其指针为_state(从2中得到的类型)。
4) 复制数据。
我遇到的问题是 3。我似乎无法获得正确类型的子类。
typeid(*data) 和 decltype(*data) 返回对子项的引用。如果我尝试使用 auto 它也是一个参考。显然我不能使用带有引用的 new 作为类型。
显然,解决这个问题的方法是在 Memento 之外新建子类的副本并将其传入。但是,我很想知道是否有一种方法可以在运行时在 Template 类中完全做到这一点。我一直在尝试看看我是否可以让它工作几个小时,而我顽固的部分不想放弃。
【问题讨论】:
标签: c++ templates casting polymorphism rtti