C++ 多态性 - 继承类的映射
C++ Polymorphism - Map of inherited classes
我有一个继承自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
调用更新方法?
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);
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 继承函数的重载解析
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 继承期间显示未知行为的子类
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 将数据添加到现有类,而无需继承、映射或修改类
- 在visual c++中从无序映射继承时,模板参数的sizeof()不正确
- C++-智能指针的矢量映射-所有这些都继承自同一基类
- 所有从同一类继承的对象的映射,调用对象方法而不是父对象;c++
- 为什么继承顺序或映射会影响 vftable 的下标?(对于 VSC 表示C++)
- 如何在 C 中映射继承的C++结构
- 映射继承
- 具有多重继承的消息映射MFC:如何避免警告C4407和运行时崩溃
- 消息映射MFC:继承多个消息映射
- C++使用模板和继承创建函数映射
- 使用继承的类作为映射值
- C++ 多态性 - 继承类的映射