模板、多态、抽象基类指针和运行时类型转换

Templates, polymorphism, abstract base class pointers and run-time casting

本文关键字:运行时 类型转换 指针 基类 多态 抽象 模板      更新时间:2023-10-16

我想在游戏中实现一个Memento模式,以实现检查点。

我在游戏中有一个GameObject指针列表。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)返回对子对象的引用。如果我尝试使用auto,它也是一个参考。显然,我不能使用new和引用作为类型。

解决这个问题的方法显然是在Memento之外新建子类的副本并将其传递进去。但是,我很想知道是否有一种方法可以在运行时完全在Template类中完成。我已经试了好几个小时了,我倔强的一面不想放弃。

你要找的是"虚拟复制构造函数",或克隆,习惯用法。

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