【发布时间】:2018-06-28 03:04:29
【问题描述】:
我目前正在用 C++ 编写游戏。这个游戏有一个 GameManager 类。 GameManager 类包含一个包含指向游戏对象的指针的映射。我已经定义了一个 GameObject 类,它是一个抽象类,仅充当接口。
我定义了两个派生自 GameObject 类的类:Enemy 和 Loot。
我希望我的 GameManager 类包含游戏对象的映射,或者更确切地说,包含指向游戏对象的指针。因为我的 GameManager 拥有这些对象,所以我希望地图包含 std::unique_ptr's。
但是,我很难将派生对象(例如敌人和战利品)实际添加到此地图。
我希望我的 GameManager 遍历游戏对象并调用抽象方法。本质上,我的 GameManager 并不关心某物是敌人、战利品还是其他什么,它只是希望能够调用基类中声明的“draw”方法。
如何将指向派生类的 unique_ptr 添加到包含基类的 unique_ptr 的映射?到目前为止,我的尝试导致我无法编译代码。我不断收到一条错误消息,指出我不允许将派生类指针动态转换为基类指针。
如果我使用原始指针,我觉得这很好,但我打算使用智能指针。
代码:
#include <memory>
#include <map>
class GameObject
{
public:
virtual void draw() = 0;
};
class Enemy : GameObject
{
public:
void draw() {};
};
class Loot : GameObject
{
public:
void draw() {};
};
int main()
{
std::map<int, std::unique_ptr<GameObject>> my_map;
// How do I add an Enemy or Loot object unique_ptr to this map?
my_map[0] = dynamic_cast<GameObject>(std::unique_ptr<Enemy>().get()); // doesn't compile, complains about being unable to cast to abstract class
return 0;
}
【问题讨论】:
-
请显示您迄今为止的尝试之一和错误消息。答案可能出人意料地简单,但为了使其易于理解,了解您来自哪里会有所帮助。
-
my_map.emplace(0, std::make_unique
()); -
@JaMiT 我已经更新了。
-
谢谢。看起来比我预期的要长一点的解释是有道理的。
标签: c++ inheritance smart-pointers unique-ptr