【问题标题】:Templates, polymorphism, abstract base class pointers and run-time casting模板、多态性、抽象基类指针和运行时强制转换
【发布时间】:2011-07-30 07:59:38
【问题描述】:

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

【问题讨论】:

    标签: c++ templates casting polymorphism rtti


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多