2

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

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

但是,我需要定义一个赋值运算符以复制“值”(而不是文档描述Qobject“身份” 。我不在任何地方使用此类的复制构造函数。

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

4

2 回答 2

9

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

T t = GetSomeT();

相对

T t;
t = GetSomeT();

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

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

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

于 2011-07-23T19:10:39.673 回答
4

正如 DeadMG 所说,虽然可能,但这是相当愚蠢的。

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

如果绝对必要,我会避免使用传统的复制构造函数/赋值运算符,而是通过成员函数工作。衍生品的预期语义QObject将保持不变,但您有办法明确地做您想做的事情。

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

    //rest of implementation
};
于 2011-07-23T19:55:48.050 回答