不能将字段'pair'声明为抽象类型'System'

时间:2014-10-04 17:10:36

标签: c++ abstract-class virtual abstract pure-virtual

我的SystemManager有一个System类的地图,其中每个系统都映射到systype类型

typedef string systype;

在头文件中,声明了此map

class SystemManager
{
    public:
        SystemManager();
        ~SystemManager();

        map<systype, System> systems;

        System* getSystemPointer(systype);
};

我尝试将DrawSystem(来自System的类)添加到我的系统地图&#34;在构造函数中:

SystemManager::SystemManager()
{
    systems["Draw"] = DrawSystem();
}

这给了我错误:

  

无法声明归档&#39; pair<systype, System>::second&#39;是抽象类型系统

我无法弄清楚造成它的原因。

以下是我的SystemDrawSystem课程,以防万一:

class System
{
    public:
        System();

        systype type;
        vector<cptype> args;
        virtual void update(vector<Cp*>) = 0; //= 0 is for pure virtual function
};

class DrawSystem : public System
{
    friend class Game; //allows to draw on render window
    public:
        DrawSystem();

        void update(vector<Cp*>);
};

2 个答案:

答案 0 :(得分:2)

按值(System)将map<systype, System> systems;存储在以下行中时:

systems["Draw"] = DrawSystem();
发生了

slicing,您实际上正在尝试创建一个System的实例,它是抽象的。

这里最简单的解决方法是切换到指针:

map<systype, System*> systems;

但请考虑使用类似std::unique_ptr的内容,以避免手动内存管理。 E.g:

map<systype, unique_ptr<System>> systems; //pre C++11: put an extra space between >>

systems["Draw"] = unique_ptr<DrawSystem>(new DrawSystem());

甚至更好 - 不使用new(按照sjdowling的评论中的建议):

systems["Draw"] = std::make_unique<DrawSystem>();

答案 1 :(得分:0)

系统 是抽象类,因为他有纯虚函数。您无法创建System的实例。 尝试执行以下操作

map<systype, System*> systems;
...
systems["Draw"] = new DrawSystem();
...
~SystemManager()
{
    // call delete for each item in systems
}