Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;不带复制构造函数的赋值运算符_C++_Qt_Copy Constructor_Assignment Operator_Qobject - Fatal编程技术网

C++ C++;不带复制构造函数的赋值运算符

C++ C++;不带复制构造函数的赋值运算符,c++,qt,copy-constructor,assignment-operator,qobject,C++,Qt,Copy Constructor,Assignment Operator,Qobject,问题:我可以定义赋值运算符而不是复制构造函数吗?对于内部类(未在API中公开),这仍然是一种糟糕的设计实践吗 我需要它的原因:如前所述,QObject将其复制构造函数和赋值运算符设置为私有,因此如果子类尝试使用其中一个,则会在编译时发出错误 但是,为了复制“值”(而不是描述的“标识”),我需要定义赋值运算符。我不在任何地方使用此类的复制构造函数 我不想编写复制构造函数的原因是,它将复制我无论如何都不会使用的代码。没有什么可以阻止你。然而,这是一个相当愚蠢的想法 T t = GetSomeT();

问题:我可以定义赋值运算符而不是复制构造函数吗?对于内部类(未在API中公开),这仍然是一种糟糕的设计实践吗

我需要它的原因:如前所述,
QObject
将其复制构造函数和赋值运算符设置为私有,因此如果子类尝试使用其中一个,则会在编译时发出错误

但是,为了复制“值”(而不是描述的“标识”),我需要定义赋值运算符。我不在任何地方使用此类的复制构造函数


我不想编写复制构造函数的原因是,它将复制我无论如何都不会使用的代码。

没有什么可以阻止你。然而,这是一个相当愚蠢的想法

T t = GetSomeT();

T t;
t = GetSomeT();
将第一个转换为第二个非常简单,但你只是在浪费我的时间,包括开发人员和处理器,让我这么做。如果它不是默认可构造的,我想这会更难…但我仍然不明白重点。复制构造函数可以由编译器定义,如果它很简单,或者你甚至可以根据如果您想要干燥,请指定操作员

class T {
    T(const T& ref) {
         *this = ref;
    }
};

没有复制构造函数也会抑制复制和交换的能力,这是实现赋值运算符的常用习惯用法。

尽管可能,正如DeadMG所说,这是相当愚蠢的

您不必从自己的类调用基类的复制构造函数,因此,如果您必须具有值语义,那么这仍然是可能的。但是在
QObject
s的上下文中,这仍然是相当非正统的。即使对于您自己的内部类,也需要记住最小意外的原则

如果绝对必要,我将避免使用传统的复制构造函数/赋值运算符,并通过成员函数进行操作。
QObject
派生的预期语义将得到维护,但您可以明确地完成您想要完成的操作

struct SomeType : QObject {
    QSharedPointer<SomeType> Clone() const;
    //or
    SomeType& CopyValue(const SomeType&);

    //rest of implementation
};
struct SomeType:QObject{
QSharedPointer Clone()常量;
//或
SomeType和CopyValue(constsometype&);
//实施的其余部分
};

虽然DeadMG的答案很好,但我认为您最好地抓住了我的意图。相反,我将实现
Clone()
函数。在QObject的情况下,定义复制构造函数或赋值迭代器可能会产生误导,并且可能会导致更多错误(因为无法干净地复制“标识”)。