[英]copy constructor and assignment operator overloading for circular dependency classes
我在代码中使用了一些供应商库。 一些代码如下。 我看到它在类之间使用循环依赖关系。我无法理解将复制构造函数和赋值设置为私有的原因是什么。 一种静态代码分析工具将冲突抛出为“避免类使用'new'分配实例,但不定义副本构造函数。”
class Parent;
class Child{
public:
Child(Parent& parent):mrParent(parent);
private:
Parent& mrParent;
};
class Parent{
public:
Parent();
~Parent();
//other declarations
Child* child;
private:
//copy and assignment are not allowed. Explicitly declaring private
Parent(const Parent&)
Parent& operator=(const Parent&);
};
您拥有的是避免复制构造和分配给类的常见方法。
如注释中所述,这就是编写该代码的人的意图:
//copy and assignment are not allowed. Explicitly declaring private
由于复制构造函数和赋值运算符都已声明但未实现,因此这可能导致静态分析工具发出警告。
在C ++ 11中,拒绝副本构建和分配的更好方法是:
Parent(const Parent&) = delete;
Parent& operator=(const Parent&) = delete;
这也应避免来自静态分析工具的警告(如果没有,则该工具可能已损坏)。
我无法理解将复制构造函数和赋值设置为私有的原因是什么。
开发人员不希望此类的用户能够复制或/和分配此类的实例。
因此,它们不提供该功能,可以通过在专用范围内声明它们来实现。
代码中的注释相当具有描述性:
//copy and assignment are not allowed. Explicitly declaring private
从静态分析收到的警告是误报:复制构造函数不是“未定义”,而是被明确拒绝。
如果复制构造函数确实是“未定义”,则编译器将生成一个无法按预期工作的编译器(由于使用了new运算符)。
但是,由于已经明确拒绝了复制构造函数,因此编译器将不会自行生成任何默认的复制构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.