繁体   English   中英

循环依赖项类的复制构造函数和赋值运算符重载

[英]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.

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