Препятствование тому, чтобы компиляторы определили конструкторов копии и оператор = перегрузка для Классов C++

Есть ли путь, которым мы можем препятствовать тому, чтобы компиляторы определили конструкторов копии, оператор = перегрузка для классов C++.

6
задан ckv 21 June 2010 в 07:50
поделиться

7 ответов

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

11
ответ дан 8 December 2019 в 04:07
поделиться

Да. Производный от boost :: noncopyable.

(Есть также способы NIH сделать это, объявив частные никогда не определенные методы для operator = и конструктора копирования, но, пожалуйста, любите boost).

6
ответ дан 8 December 2019 в 04:07
поделиться

Определение? Ну да. Они всегда объявляются (явно вами или неявно компилятором), но они определяются компилятором только тогда, когда / если вы их действительно используете. Не используйте их - и компилятор их не определит.

Конечно, если под «запретить компиляторам определять ...» вы имеете в виду «запретить компиляторам успешно определять ...», то есть если вы хотите, чтобы попытка неявного определения не удалась при компиляции time, то вы можете добиться этого, добавив в свой класс конструктивный и / или не назначаемый подобъект без копирования (например, базовый или член с частным конструктором копирования и частным оператором присваивания).

2
ответ дан 8 December 2019 в 04:07
поделиться

Наследование от типа, который объявляет эти функции в частной области, например boost :: noncopyable .

Или ... иметь ссылочную переменную-член: P

1
ответ дан 8 December 2019 в 04:07
поделиться

Объявите эти функции сами и сделайте их приватными. Также вы не можете написать определения этих функций, поэтому каждый, кто попытается использовать эти функции - получит ошибку компоновщика.

3
ответ дан 8 December 2019 в 04:07
поделиться

В C++0x вы сможете написать

class NonCopyable {
  NonCopyable & operator=(NonCopyable const&) = delete;
  NonCopyable(NonCopyable const&) = delete;
};

Обратите внимание, что компилятор в любом случае не будет генерировать преобразующие NonCopyable::operator=(Other const&) перегрузки.

3
ответ дан 8 December 2019 в 04:07
поделиться

FWIW, если вы когда-нибудь начнете использовать Qt, вы можете использовать макрос Q_DISABLE_COPY:

class Foo
{
public:
  Foo();

private:
  Q_DISABLE_COPY(Foo)
};
0
ответ дан 8 December 2019 в 04:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: