我有一个MovementSystem
类,它继承自System
类。稍后我会有一些xxxSystem
类,所以我会以这种方式在地图中存储xxxSystem
的实例(每个系统只有一个实例):
enum
{
MOVEMENT_SYSTEM
};
std::map<int,std::unique_ptr<System>> systems;
systems[MOVEMENT_SYSTEM] = std::unique_ptr<System>(new MovementSystem());
m_entityManager.loadSystems(&systems);
最后一行是因为我需要我的班级EntityManager
才能访问所有系统。
因此我有这个方法:
std::map<int,std::unique_ptr<System>> *m_systems; // this line is in the header
void EntityManager::loadSystems(std::map<int,std::unique_ptr<System>> *systems)
{
m_systems = systems;
}
最后在EntityManager
的另一种方法中,我尝试以这种方式访问我发送给类的系统:
std::unique_ptr<MovementSystem> mvt = (*m_systems)[MOVEMENT_SYSTEM];
mvt->update(dt);
但是我收到了这个错误:
conversion from 'std::map<int, std::unique_ptr<System> >::mapped_type {aka std::unique_ptr<System>}' to non-scalar type 'std::unique_ptr<MovementSystem>' requested
如何解决此问题,并从MovementSystem
答案 0 :(得分:0)
std::unique_ptr<MovementSystem> mvt = *m_systems[MOVEMENT_SYSTEM];
这条线有两个问题。一,运算符优先级是这样的,它将被解释为:
*(m_systems[MOVEMENT_SYSTEM])
这意味着它会将指针算术应用于指针m_systems
(访问{34;数组中的MOVEMENT-SYSTEM
元素&#34;由{{指向1}})然后将m_systems
应用于该地图,这是无意义的。你想要的是这个:
*
第二个问题是您正在尝试复制唯一指针。这正是设计用来防止的唯一指针。
你可能想要的只是获取指针,并相应地投射它:
(*m_systems)[MOVEMENT_SYSTEM]
或者,甚至更好,因为它摆脱了不必要的指针:
MovementSystem *mvt = static_cast<MovementSystem*>((*m_systems)[MOVEMENT_SYSTEM].get());