2011-04-05 98 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