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

时间:2017-09-18 12:02:54

标签: c++ class oop

我在我的代码中使用了一些供应商库。一些代码如下所示。我看到它在类之间使用循环依赖。我无法理解将复制构造函数和赋值设置为私有的原因是什么。 其中一个静态代码分析工具会违反#34;避免使用' 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&);
};

3 个答案:

答案 0 :(得分:2)

您所拥有的是避免复制构建和分配到班级的常用方法 这就是编写该代码的人的意图,如评论中所述:

//copy and assignment are not allowed. Explicitly declaring private

由于复制构造函数和赋值运算符都已声明但未实现,因此可能会导致静态分析工具发出警告。

在C ++ 11中,拒绝复制构造和赋值的更好方法是:

Parent(const Parent&) = delete;
Parent& operator=(const Parent&) = delete;

这也应该避免来自静态分析工具的警告(如果没有,该工具可能会被破坏)。

答案 1 :(得分:1)

  

我无法理解将复制构造函数和赋值设置为私有的原因是什么。

开发人员不希望类的用户能够复制或/并分配此类的实例。

由于这个原因,他们没有提供这种功能,可以通过在私人范围内声明它们来完成。

代码中的注释相当具有破坏性:

//copy and assignment are not allowed. Explicitly declaring private

答案 2 :(得分:1)

从静态分析中收到的警告是误报:复制构造函数不是"未定义"但明确否认。

如果复制构造函数确实是"未定义"然后编译器会生成一个不能按预期工作的编译器(因为新的操作符)。

但是,由于复制构造函数已被明确拒绝,因此编译器不会自行生成任何默认的复制构造函数。