将派生类传递到映射 c++ 中
Passing a derived class into a map c++
我想做的是将管理器放入映射中,然后调用与每个管理器相关的函数。因为我有不同类型的经理,所以我创建了一个基类,如下所示:
class iGyroManager {
public:
iGyroManager() {}
virtual ~iGyroManager() = default;
virtual bool preInit() = 0;
virtual bool init() = 0;
virtual bool postInit() = 0;
virtual void update() = 0;
virtual void cleanup() = 0;
}
非常简单,显然就像一个魅力。
然后,我执行以下操作来创建派生类:
class GyroAudioManager : public iGyroManager {
public:
GyroAudioManager();
~GyroAudioManager() override;
bool preInit() override;
bool init() override;
bool postInit override;
void update() override;
bool cleanup() override;
}
同样,简单明了。cpp 是非常基本的,只是声明裸函数。
然后,我创建一个最终的派生类:
class GyroAppStateManager : iGyroManager {
private:
std::map<int, iGyroManager&> m_managerMap;
public:
GyroAppStateManager();
~GyroAppStateManager() override;
bool preInit() override;
bool init() override;
bool postInit() override;
int start();
void update() override;
bool registerManager(iGyroManager& manager);
bool cleanup() override;
}
这似乎有效,但它在 registerManager 函数中分崩离析:
bool GyroAppStateManager::registerManager(iGyroManager& manager) {
// Try to insert a derived class into a base class map using what
// should be working.
m_managerMap.insert(1, manager);
return true;
}
在调用函数中:
int start() {
GyroAudioManager m_audioManager = GyroAudioManager();
mp_appStateManager->registerManager(m_audioManager);
/* use mp_appStateManager here, while m_audioManager is alive */
}
除了这似乎根本不起作用并吐出以下内容:
error: no matching function for call to std::map<int, iGyroManager&>::insert(int, iGyroManager&)
所以我的问题是我做错了什么?正如我上面提到的,我想添加多个不同的管理器类,这些类派生到这个映射中,然后能够从中运行某些函数。
真的有办法吗?
不能有引用的标准容器。 我仍在寻找限制的确切措辞,但与此同时,您可能想尝试std::reference_wrapper
,或者一个(智能(指针的容器,这也允许多态性。
实际上,即使mapped_type
是引用,value_type
也是对象类型std::pair<key_type, mapped_type>
。 所以没关系。
导致该错误是因为要std::map<Key,Value>::insert
的参数是一个pair<Key,Value>
,而不是两个单独的参数。 尝试
m_managerMap.insert({1, manager});
但是,您需要安排引用一个对象,该对象不会立即被销毁,当start()
返回时。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- 错误处理.将系统错误代码映射到泛型
- C++匿名结构作为std::映射值
- 如何从存储在std::映射中的std::集中删除元素
- 递归无序映射
- 正在VS调试器中监视映射条目