gpt4 book ai didi

c++ - 在 std::unordered_map 中存储指向不同类型类的指针

转载 作者:行者123 更新时间:2023-11-30 03:36:07 25 4
gpt4 key购买 nike

我有需要进行操作的设备。我有一个基类 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;

那么问题是如何区分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:如果您动态创 build 备对象,您可以考虑在映射中使用唯一或共享指针,以避免内存泄漏。

关于c++ - 在 std::unordered_map 中存储指向不同类型类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40830225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com