C++ unordered_map 默认分配器

标签 c++ class inheritance unordered-map

我有一个抽象类(parent),并且刚刚从中创建了派生类(child),如下所示:

class parent {
public:
    virtual string print()=0;
};

template<class T>
class child: public parent{
private:
    unordered_map<string, parent*> children;
public:
    parent *&operator[](string name) {
        return children[name];
    }
    virtual string print(){
        //some jobs...
    }
}

好的。现在我使用如下的派生类:

child<string> a;
a["test"]->print();

问题就出来了。

我认为问题在于 unordered_map::[] 运算符创建了一个 parent 类的实例,而不是我想要的 child 类。

如何告诉 unordered_map 创建新项目作为 child < string >

最佳答案

unordered_map<std::string, parent *>::operator[]不会创建任何类的实例,因为它的值是指针,而不是类实例。因此,如果您使用它来访问之前未插入到映射中的键,它将默认初始化一个指针(将其初始化为 nullptr)并将其存储在映射中。

如果您想在映射中使用任何非 nullptr 值,您需要自己将它们存储在那里。您可以在 operator[] 中执行此操作功能:

parent *&operator[](string name) {
    auto &rv = children[name];
    if (!rv) rv = new child<T>;
    return rv;
}

如果您覆盖任何通过引用返回的指针,则存在内存泄漏的危险,而且您需要在析构函数中释放它们。您可以通过返回 parent * 来避免前一个问题。而不是parent *& ,或使用 std::unique_ptr<parent>在 map 中并返回 std::unique_ptr<parent> &在这里。

关于C++ unordered_map 默认分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62393504/

相关文章:

c++ - 将可变参数模板参数转换为其他类型

c++ - 为什么我不能访问派生构造函数的成员初始化列表中继承的 protected 字段?

c# - 模型绑定(bind)和继承 ASP MVC 5

java - 调用 super.super.method,跳过 super.method

c++ - `VirtualAllocEx`指定不同的起始地址时返回相同的地址?

c++ - 将目录压缩成单个文件的方法有哪些

c++ - 将 std::integer_sequence 作为模板参数传递给元函数

C++ 类变量作用域

c# - 在 ASP.NET RadioButtonList 中向 LI 添加类

c++ - 如何在没有任何运行时成本的情况下将类接口(interface)的不同部分暴露给不同的类?