c++ - 模板、多态性、抽象基类指针和运行时转换

标签 c++ templates casting polymorphism rtti

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

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

解决这个问题的方法显然是在 Memento 之外新建子类的拷贝并将其传递进来。但是,我很想知道是否有一种方法可以在运行时在 Template 类中完全做到这一点。几个小时以来,我一直在尝试看看是否能让它正常工作,我固执的那部分不想放弃。

最佳答案

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

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

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

//..

关于c++ - 模板、多态性、抽象基类指针和运行时转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5558504/

相关文章:

c++ - 其他模板可用的功能?

c++ - 为什么下面的代码可以用 MSVC++ 编译?

templates - 将 Drupal 7 中的 front.tpl 用于另一个页面

c++ - 自定义内存分配器 : T* pointer, operator new 与 void pointer cast

c++ - 从 C++ 中的字符串中删除非整数

c++ - 在具有不同签名的 std::function 之间进行转换(T* arg 到 void* arg)

c++ - 为什么在 64 位机器上的 C++ 中 int 的大小不是 8 个字节。还有 gcc 的任何版本都支持 8 字节 int 吗?

java - 将字节数组转换为 java 类型

c++读取csv文件并操作数据然后打印错误

postgresql - 结合 SUM 和 CAST - 不起作用?