Оператор присваивания С++ без конструктора копирования

Вопрос: можно ли определить оператор присваивания, а не конструктор копирования? Для внутреннего класса (не представленного в API) это все еще плохая практика проектирования?

Причина, по которой мне это нужно: как упоминается в в этом вопросе, QObject создает свой конструктор копирования и оператор присваивания private, так что если подкласс попытается использовать любой из них, во время компиляции будет выдано сообщение об ошибке.

Однако мне нужно определить оператор присваивания, чтобы скопировать «значение» (а не «идентификацию» как описывается в Qobject документации. Я нигде не использую конструктор копирования этого класса.

Причина, по которой я не хочу писать конструктор копирования, заключается в том, что он будет дублировать код, который я все равно не буду использовать.


person Alan Turing    schedule 23.07.2011    source источник


Ответы (2)


Хотя возможно, как говорит DeadMG, это довольно глупо.

Вам не нужно вызывать конструктор копирования базового класса из своего собственного, поэтому, если вам абсолютно необходимо иметь семантику значений, это все еще возможно. Но в контексте QObjects это все еще довольно неортодоксально. Даже для ваших собственных внутренних занятий необходимо помнить о принципе наименьшего удивления.

Если это абсолютно необходимо, я бы избегал традиционного конструктора копирования/оператора присваивания и работал через функции-члены. Ожидаемая семантика производных QObject будет сохранена, но у вас есть способ явно сделать то, что вы хотите сделать.

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

    //rest of implementation
};
person Dennis Zickefoose    schedule 23.07.2011
comment
Хотя ответ DeadMG хороший, я думаю, вы лучше всего уловили мои намерения. Вместо этого я собираюсь реализовать функцию Clone(). В случае QObject определение конструктора копирования или итератора присваивания, вероятно, вводит в заблуждение и может вызвать больше ошибок, чем нет (поскольку идентичность не может быть скопирована чисто). - person Alan Turing; 24.07.2011

Вас ничего не останавливает. Однако это довольно глупая идея.

T t = GetSomeT();

против

T t;
t = GetSomeT();

Довольно тривиально преобразовать первое во второе, но вы просто тратите мое время, как разработчика, так и процессора, заставляя меня это делать. Если бы это не конструировалось по умолчанию, я думаю, это было бы сложнее... но я все еще не вижу смысла. Конструктор копирования может быть определен компилятором, если это тривиально, или вы даже можете определить его в терминах оператора присваивания, если хотите DRY.

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

Отсутствие конструктора копирования также будет препятствовать возможности копирования и замены, что является обычной идиомой для реализации операторов присваивания.

person Puppy    schedule 23.07.2011