Оператор присваивания C ++ без конструктора копирования - PullRequest
2 голосов
/ 23 июля 2011

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 23 июля 2011

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

T t = GetSomeT();

против

T t;
t = GetSomeT();

Довольно тривиально преобразовать первое во второе, но вы просто теряете мое время, оба разработчикаи процессор, заставляющий меня это делать.Если это не по умолчанию, я думаю, что это будет сложнее ... но я все еще не вижу смысла.Конструктор копирования может быть определен компилятором, если он тривиален, или вы можете даже определить его в терминах оператора присваивания, если вы хотите СУХОЙ.copy-and-swap, обычная идиома для реализации операторов присваивания.

4 голосов
/ 23 июля 2011

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

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

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

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

    //rest of implementation
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...