2011-04-05 58 views
1

我想在游戏中实现一个纪念模式来实现检查点。模板,多态,抽象基类指针和运行时铸造

我有一个GameObject指针在游戏中的列表。 GameObject是一个抽象类,它是由像StaticObject,AnimatedObject等类实现的...

我想使我的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,它也是一个参考。显然,我不能使用新的参考作为类型。

解决这个问题的方法显然是在Memento之外新建子类的副本并将其传入。但是,我有兴趣知道是否有一种方法可以在运行时在Template类中完全执行。我一直在试着看看我能否让它工作几个小时,而我固执的一部分并不想放弃。

回答

4

你在找什么是“虚拟拷贝构造函数”,或克隆,成语。

class GameObject { 
    ... 
public: 
    virtual GameObject* clone() = 0; 
}; 

class StaticObject : public GameObject { 
    ... 
public: 
    virtual StaticObject* clone() { return new StaticObject(*this); } 
}; 

//.. 
+0

Thankyou !!!!!!! – whalebiologist 2011-04-05 21:23:20