模板,多态,抽象基类指针和运行时强制转换

时间:2011-04-05 21:05:34

标签: c++ templates casting polymorphism rtti

我想在游戏中实现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类中完成。我一直试图看看我是否可以让它工作几个小时,我的顽固部分不想放弃。

1 个答案:

答案 0 :(得分:4)

您正在寻找的是“虚拟副本构造函数”,或克隆,成语。

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

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

//..