我有一个继承自System类的MovementSystem类。稍后,我将拥有许多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调用更新方法
发布于 2016-07-06 20:49:39
std::unique_ptr<MovementSystem> mvt = *m_systems[MOVEMENT_SYSTEM];这条线有两个问题。第一,运算符的优先级是这样的,它将被解释为:
*(m_systems[MOVEMENT_SYSTEM])这意味着它将对指针数组应用指针算法(访问m_systems指向的“m_systems”中的第MOVEMENT-SYSTEM个元素),然后将*应用于该映射,这是无稽之谈。你想要的是:
(*m_systems)[MOVEMENT_SYSTEM]第二个问题是你试图复制一个唯一的指针。这正是独特的指针被设计来防止的。
您可能需要的是简单地获取指针,并相应地转换它:
MovementSystem *mvt = static_cast<MovementSystem*>((*m_systems)[MOVEMENT_SYSTEM].get());或者,更好的原因是它去掉了不必要的指针:
auto &systems = *m_systems;
auto &mvt = static_cast<MovementSystem&>(*systems[MOVEMENT_SYSTEM]);
mvt.update(dt);https://stackoverflow.com/questions/38224259
复制相似问题