Есть ли путь, которым мы можем препятствовать тому, чтобы компиляторы определили конструкторов копии, оператор = перегрузка для классов C++.
Вы можете объявить эти функции как приватные, что не позволит людям использовать их при работе с вашим классом и в то же время не позволит компилятору генерировать их.
Да. Производный от boost :: noncopyable.
(Есть также способы NIH сделать это, объявив частные никогда не определенные методы для operator = и конструктора копирования, но, пожалуйста, любите boost).
Определение? Ну да. Они всегда объявляются (явно вами или неявно компилятором), но они определяются компилятором только тогда, когда / если вы их действительно используете. Не используйте их - и компилятор их не определит.
Конечно, если под «запретить компиляторам определять ...» вы имеете в виду «запретить компиляторам успешно определять ...», то есть если вы хотите, чтобы попытка неявного определения не удалась при компиляции time, то вы можете добиться этого, добавив в свой класс конструктивный и / или не назначаемый подобъект без копирования (например, базовый или член с частным конструктором копирования и частным оператором присваивания).
Наследование от типа, который объявляет эти функции в частной области, например boost :: noncopyable .
Или ... иметь ссылочную переменную-член: P
Объявите эти функции сами и сделайте их приватными. Также вы не можете написать определения этих функций, поэтому каждый, кто попытается использовать эти функции - получит ошибку компоновщика.
В C++0x вы сможете написать
class NonCopyable {
NonCopyable & operator=(NonCopyable const&) = delete;
NonCopyable(NonCopyable const&) = delete;
};
Обратите внимание, что компилятор в любом случае не будет генерировать преобразующие NonCopyable::operator=(Other const&)
перегрузки.
FWIW, если вы когда-нибудь начнете использовать Qt, вы можете использовать макрос Q_DISABLE_COPY
:
class Foo
{
public:
Foo();
private:
Q_DISABLE_COPY(Foo)
};