我想在游戏中实现Memento模式以实现检查点。
我在游戏中有一个GameObject指针列表。 GameObject是一个抽象类,由StaticObject,AnimatedObject等类实现......
我想让我的Memento课程尽可能抽象,所以我模仿了我的整个Memento系统。
my(非常准确,出于调试目的)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类中完成。我一直试图看看我是否可以让它工作几个小时,我的顽固部分不想放弃。
答案 0 :(得分:4)
您正在寻找的是“虚拟副本构造函数”,或克隆,成语。
class GameObject {
...
public:
virtual GameObject* clone() = 0;
};
class StaticObject : public GameObject {
...
public:
virtual StaticObject* clone() { return new StaticObject(*this); }
};
//..