将指针存储在std :: unordered_map中的不同类型的类中

store pointers to different types of classes in an std::unordered_map

本文关键字:同类型 map unordered 存储 指针 std      更新时间:2023-10-16

我有我需要进行操作的设备。我有一个基类BASE和一个子类TYPE1。每个设备都是TYPE1的实例。根据XML配置文件中存在的内容,这些类别由其他类实例化。

class BASE {
public:
    BASE();
    virtual ~BASE();
};
class TYPE1 : public BASE {
public:
    TYPE1();
};

现在我将这些实例的指针存储在std::unordered_map中,定义为:

std::unordered_map <std::string, TYPE1 *> myDevices;

std::string是一个标识密钥,也用于配置文件中。

std::unordered_map如果需要,如果我需要使用

迭代它,则可以快速直接访问对象,并且在所有设备上进行相同操作的便利性
for ( auto& elem : myDevices ) {
    //do stuff
}

设备的顺序不重要,因此std::unordered_map。我在整个代码中广泛使用它。

现在,我需要一个TYPE2,它也是BASE的孩子,但仍有不同的类型。

TYPE1TYPE2都实现了相同的方法 - 它们的功能不同 - 但产生相同的结果

我的问题:

如何修改

std::unordered_map <std::string, TYPE1 *> myDevices; 

因此,它接受所有类型的类,例如

std::unordered_map <std::string, acceptAnyTypeOfClass *> myDevices;

我对此感到震惊,虽然我认为我可以很快就会变得丑陋,而且我真的很想以一种干净的方式做到这一点。我问的是什么,如果是这样的话?

想到的第一个选项是使用指针指向基类,因为TYPE1TYPE2对象都是BASE对象:

std::unordered_map <std::string, BASE*> myDevices;

然后,问题是ho wto使TYPE1*指针和TYPE2*指针之间有所不同吗?

作为TYPE1TYPE2都具有相同的方法,最佳方法可能是使用多态性,使用虚拟函数:

class BASE {
public:
    BASE();
    virtual void doSomething()=0;  
    virtual ~BASE();
};
class TYPE1 : public BASE {
public:
    TYPE1();
    void doSometing() override { /* the code for TYPE 1 devices*/ }
};
class TYPE2 : public BASE {
public:
    TYPE2();
    void doSometing() override { /* the code for TYPE 2 devices*/ }
};

您可以调用功能,而不必担心基本对象的真实类型:

std::unordered_map <std::string, BASE*> myDevices;
...
for (auto& elem : myDevices ) {
    elem->doSomething();  
}

p.s:如果动态创建设备对象,则可以考虑在地图中使用唯一或共享的指针,以避免内存泄漏。