我想在游戏中实现 Memento 模式以实现检查点。
我有一个游戏对象指针列表。 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) 返回对 child 的引用。如果我尝试使用 auto,它也是一个引用。显然我不能使用带有引用的 new 作为类型。
解决这个问题的方法显然是在 Memento 之外新建子类的拷贝并将其传递进来。但是,我很想知道是否有一种方法可以在运行时在 Template 类中完全做到这一点。几个小时以来,我一直在尝试看看是否能让它正常工作,我固执的那部分不想放弃。
最佳答案
您正在寻找的是“虚拟复制构造函数”,或克隆,成语。
class GameObject {
...
public:
virtual GameObject* clone() = 0;
};
class StaticObject : public GameObject {
...
public:
virtual StaticObject* clone() { return new StaticObject(*this); }
};
//..
关于c++ - 模板、多态性、抽象基类指针和运行时转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5558504/