将指针存储在std :: unordered_map中的不同类型的类中
store pointers to different types of classes in an std::unordered_map
我有我需要进行操作的设备。我有一个基类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
的孩子,但仍有不同的类型。
TYPE1
和TYPE2
都实现了相同的方法 - 它们的功能不同 - 但产生相同的结果
我的问题:
如何修改
std::unordered_map <std::string, TYPE1 *> myDevices;
因此,它接受所有类型的类,例如
std::unordered_map <std::string, acceptAnyTypeOfClass *> myDevices;
我对此感到震惊,虽然我认为我可以很快就会变得丑陋,而且我真的很想以一种干净的方式做到这一点。我问的是什么,如果是这样的话?
想到的第一个选项是使用指针指向基类,因为TYPE1
和TYPE2
对象都是BASE
对象:
std::unordered_map <std::string, BASE*> myDevices;
然后,问题是ho wto使TYPE1*
指针和TYPE2*
指针之间有所不同吗?
作为TYPE1
和TYPE2
都具有相同的方法,最佳方法可能是使用多态性,使用虚拟函数:
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:如果动态创建设备对象,则可以考虑在地图中使用唯一或共享的指针,以避免内存泄漏。
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 类型为 'std::map< char,int > 的 <Swig 对象的代理
- std::map 保存任何值类型
- 标准::map键类型的严格弱排序概念
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 将参数列表未知的可变参数模板类型定义为 std::map 值类型
- 不完整的类型为 std::map 的成员
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 具有 std::map 和 std::variant 的不完整类型
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 如何在 c++ 中使用返回类型导出函数 std::map
- 错误:与'operator='不匹配(操作数类型为"std::map<int、double>::iterator
- 为什么C++允许类型没有 std::map 的默认构造函数,而没有 std::p air
- CRTP 模式 但是在数据结构中存储非同构类型
- 将QML数组和MAP/对象类型与C 区分开
- std::map使用不同的数据类型进行值
- 如何打印这种类型map的值map
, int>关联[2]