不确定我能不能做到这一点。我的问题是 [this other question]( Can you create a std::map of inherited classes? ).
基本上,下面问题的答案是创建一个指向继承类的指针映射,其中可以根据第一个映射条目搜索该映射。然后你调用使用指针来寻址你想要的任何虚函数。
我已经用一些命令实现了一个命令处理器应用程序。 map 是:
std::map<string, BaseCmdClass*> cmd_map;
到目前为止一切都很好。但是,我们正在更新我们的代码以提供可能的数百个派生类。我不想在代码开头的工厂类中创建它们,太多的内存使用。
我想在需要的时候动态构造一个继承类,然后使用基类指针删除。我想避免使用大的 case 语句来调用每个构造函数。
有没有一种方法可以创建 std::map
或使用另一个可以查找要调用的构造函数的 STL 容器?然后,当我需要派生构造函数时,我可以查找此映射以找到要调用的正确派生构造函数。
最佳答案
Is there a way I can create a std::map or use another STL container that can lookup what constructor to call?
当然。您不能直接存储指向构造函数的指针,但可以存储指向调用构造函数的工厂函数的指针。
using CmdFactory = BaseCmdClass*();
std::map<std::string, CmdFactory*> factory_map;
您可以使用辅助模板来生成工厂:
template<class T>
BaseCmdClass* factory() {
return new T;
}
你可以像这样添加一个工厂:
factory_map["Derived1"] = factory<Derived1>;
I want to construct an inherited class dynamically when I need it, then delete using the base class pointer. I want to avoid a big case statement to call each constructor.
使用基类指针删除就好了,只要析构函数是虚函数。无需案例陈述。
进一步发展:
您可以使用 std::function
如果您需要有状态工厂,而不是函数指针。
我建议返回 std::unique_ptr<BaseCmdClass>
来自工厂以避免内存泄漏。
为了降低内存开销,如果使用整数作为键,则可以使用数组而不是映射,但是构造数组的代码必须了解所有子项。
关于c++ - 动态创建继承类,使用 std::map 使用基类指针访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43659483/