gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:09:24 25 4
gpt4 key购买 nike

我想在游戏中实现 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com