2014-10-04 59 views
0

SystemManager已地图System类,其中每个系统被映射到输入systype无法声明字段“对”是

typedef string systype; 

在标题文件的,这map被声明抽象类型“系统”的:

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

     map<systype, System> systems; 

     System* getSystemPointer(systype); 
}; 

我尝试将DrawSystem(从System派生类)添加在构造函数中我的“系统图”:

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

这给我的错误:

cannot declare filed ' pair<systype, System>::second ' to be of abstract type System

我想不出是什么原因造成的。

这里是我的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

当存储System S按值(map<systype, System> systems;)在下面的行:

systems["Draw"] = DrawSystem(); 

slicing发生和你”实际上试图创建一个System的实例,这是抽象的。

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

map<systype, System*> systems; 

还要考虑使用类似std::unique_ptr代替,以避免手动内存管理。例如:

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>(); 
0

系统是abstact类,因为他拥有纯粹的虚拟功能。您无法创建System的实例。 尝试以下操作

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