我的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;是抽象类型系统
我无法弄清楚造成它的原因。
以下是我的System
和DrawSystem
课程,以防万一:
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*>);
};
答案 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
}