将派生类传递到映射 c++ 中

Passing a derived class into a map c++

本文关键字:映射 c++ 派生      更新时间:2023-10-16

我想做的是将管理器放入映射中,然后调用与每个管理器相关的函数。因为我有不同类型的经理,所以我创建了一个基类,如下所示:

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()返回时。