C ++多态性 - 继承类的映射

时间:2016-07-06 12:40:18

标签: c++ polymorphism

我有一个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

获取最后一行来调用更新方法

1 个答案:

答案 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());