我认为如果我首先显示我的代码然后解释我的问题会更好。
std::map<std::string, SManager> m_managers;
//SResourceManager is derived from SManager
SResourceManager& getResourceManager() { return m_managers["resource_manager"]->second; }
我要做的是从SManager(可能是SResourceManager的副本)返回一个引用,以便能够在其他地方使用。我知道我可以使用像std :: shared_ptr这样的东西,但我不想在这种情况下使用指针,因为我希望地图中的SResourceManager可能会改变,但留在那里。有没有办法将其转换为我实际可以返回的值?
由于
答案 0 :(得分:1)
“SResourceManager派生自SManager”。从基类型到派生类型将需要显式转换。
然而,你有一个更大的问题。您的地图直接包含SManager对象。因此,它不会也永远不会包含SResourceManager对象或任何其他派生类型。无论你编写什么代码填充该地图,最有可能最终切断衍生部分。
如果您希望根据实际可以引用派生类型对象的基本类型进行处理,那么您需要以某种方式使用指针。 unique_ptr或shared_ptr是合理的选择。
所以你最终会得到类似的东西:
std::map<std::string, std::unique_ptr<SManager>> m_managers;
SResourceManager& getResourceManager() { return *static_cast<SResourceManager*>(m_managers["resource_manager"].get()); }
答案 1 :(得分:0)
看起来您使用的语法不正确。如果假设类型SManager被声明为指向多态类的指针,那么该函数将按以下方式显示
SResourceManager& getResourceManager() { return *m_managers["resource_manager"]; }