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

时间:2011-07-23 19:02:51

标签: c++ qt copy-constructor assignment-operator qobject

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

我需要它的原因:正如this question提到的那样,QObject使其复制构造函数和赋值运算符变为私有,这样如果子类尝试使用其中任何一个,则错误是在编译时发布。

我需要定义一个赋值运算符,以便复制“value”(而不是the Qobject documentation描述的“identity”。我不会在任何地方使用这个类的复制构造函数。

我不想编写复制构造函数的原因是它将复制我不会使用的代码。

2 个答案:

答案 0 :(得分:9)

没有什么能阻止你。然而,这是一个非常愚蠢的想法。

T t = GetSomeT();

T t;
t = GetSomeT();

将第一个转换为第二个非常简单,但你只是浪费我的时间,开发和处理器,让我做到这一点。如果它不是默认构造的,我想它会更难......但我仍然没有看到这一点。复制构造函数可以由编译器定义,如果它是微不足道的,或者你甚至可以根据赋值运算符定义它,如果你想要DRY。

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

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

答案 1 :(得分:4)

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

您不必从您自己的类中调用基类的复制构造函数,因此如果您必须具有值语义,那么它仍然是可能的。但是在QObject s的背景下,这仍然相当不正统。即使对于你自己的内部课程,仍然需要牢记最少惊喜的原则。

如果绝对必要,我会避免传统的复制构造函数/赋值运算符,并通过成员函数工作。 QObject衍生词的预期语义将被保留,但是你有办法明确地做你想做的事。

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

    //rest of implementation
};