我在我的代码中使用了一些供应商库。一些代码如下所示。我看到它在类之间使用循环依赖。我无法理解将复制构造函数和赋值设置为私有的原因是什么。 其中一个静态代码分析工具会违反#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&);
};
答案 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)
从静态分析中收到的警告是误报:复制构造函数不是"未定义"但明确否认。
如果复制构造函数确实是"未定义"然后编译器会生成一个不能按预期工作的编译器(因为新的操作符)。
但是,由于复制构造函数已被明确拒绝,因此编译器不会自行生成任何默认的复制构造函数。