c++ - 动态创建继承类,使用 std::map 使用基类指针访问?

标签 c++ c++11 inheritance stl stdmap

不确定我能不能做到这一点。我的问题是 [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/

相关文章:

c++ - 填充静态 unordered_map 局部变量

C++ 随机数生成器只生成 0 - C++ 11

c++ - 为什么使用 popen() 读取时会出现内置延迟?

c++ - openssl 内存泄漏 : me or bug?

c++ - 计算最多包含 K 个(随机放置)的 NxN 矩阵中最大正方形的面积

c++ - 限制int数据类型的大小

c# - 什么时候从继承类创建对象?

javascript - 继承:如何在重写的方法中模拟 super.method

java - Eclipse 中未找到继承方法

c++ - 我从 std::multimap.lower_bound 得到一个无效指针