繁体   English   中英

C ++:使用指向unordered_map的指针还是仅将其定义为类中此类的成员变量?

[英]C++:using pointer to unordered_map or just defining it as a member variable from this type in a class?

我有一个无法理解的问题:

假设我有一个包含多个成员字段的class System ,其中一个成员字段的类型为unordered_map ,所以当我在头文件中声明该类时,我将在头文件#include <unordered_map>的开头写入内容。

现在,我有两种声明该字段的方法:

1.std::unordered_map<std::string,int> umap;
2.std::unordered_map<std::string,int>* p_umap;

现在在类的构造函数中,如果我选择第一个选项,则无需初始化初始化程序列表中的该字段,因为class System的构造函数将调用umap的默认构造函数作为构造类型实例的一部分class System

如果选择第二个选项,则应使用构造函数new和析构函数在构造函数中(在初始化列表中)初始化字段p_umap ,以删除此动态分配。

这两个选项有什么区别? 如果您有一个其中某个字段的类型为unordered_map的类,那么如何声明此字段? 作为指针还是unordered_map类型的变量?

在您所描述的情况下,似乎第一个选项更可取。 实际上,最有可能的是,无序映射打算由属于它的数据成员的类拥有 换句话说,其生存期不应超过封装类的生存期,并且封装类负责创建和销毁无序映射。

使用选项1时,所有这些工作都是自动完成的,而使用选项2时,您将必须手动进行处理(并注意正确的复制构造,复制分配,异常安全性,内存泄漏等)。 。 当然,您可以使用智能指针(例如std::unique_ptr<> )将此职责封装到包装器中,当智能指针本身超出范围时,它将负责删除包装的对象(此惯用法称为RAII,这是一个资源获取的首字母缩写是初始化 )。

但是,在我看来, 似乎根本不需要指针 您有一个对象,其生存期完全由包含该对象的类的生存期限制。 在这些情况下,您不应仅使用指针,而应将变量声明为:

std::unordered_map<std::string, int> umap;

让它不是一个指针 ,直到你需要它的指针。

指针到处都是用户错误。

例如,您忘记提及您的class System也将需要实现

System( const Sysytem& )

System& operator= ( const System& )

或尝试复制对象时,将出现“不良行为”。

不同之处在于您希望如何访问umap。 指针可以提供更多的灵活性,但显然会增加分配方面的复杂性(堆栈与堆,析构函数等)。 如果使用指向umap的指针,则可以执行一些复杂的工作,例如使用相同的umap制作两个System。 最后,除非有令人信服的理由,否则请选择KISS。

无需将其定义为指针。 如果这样做,还必须确保实现复制构造函数和赋值运算符,或者完全禁用它们。

如果没有特定的理由使其成为指针(并且您没有显示任何指针),只需使其成为普通成员变量即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM