Я хочу, чтобы гарантировать, что следующий тип вызова является незаконным:Могу ли я предотвратить назначение объекта?
MyClass me;
MyClass you;
me = you; // how to make this illegal?
Возможно ли это?
Я хочу, чтобы гарантировать, что следующий тип вызова является незаконным:Могу ли я предотвратить назначение объекта?
MyClass me;
MyClass you;
me = you; // how to make this illegal?
Возможно ли это?
Declare оператор присваивания: частный
class A {
private:
void operator=(const A&);
...
};
но не обеспечивает реализацию - вы получите ошибку компиляции или ссылки времени, если вы попытаетесь выполнить задание А.
Я предпочитаю использовать макрос для этого. Это также предотвращает копирование, сделав конструктор копирования частной тоже:
#define CANNOT_COPY(class) \
private: \
class(const class&); \
void operator=(const class &) \
Затем я могу сказать что-то вроде:
class A {
CANNOT_COPY(A);
...
};
, который легко читать и легко найти.
объявить оператора присваивания private
.
Да - определить частный оператор назначения (operator=
) или получить из удобного класса boost::noncopyable
.
Это на самом деле 'подталкивание: noncopyable' без подчеркивания. – fredoverflow
Упс. Приветствую Фреда. – Rob
Использование const.
MyClass const me;
MyClass you;
me = you; // compilation error
Я использую для вывода своих неопубликованных классов из общего класса noncopyable. Если не использовать импульс, я обычно использую этот ярлык:
class NonCopyable
{
protected:
/**
* Protected default constructor
*/
NonCopyable() {}
/**
* Protected destructor
*/
~NonCopyable() {}
private:
/**
* Private copy constructor
*/
NonCopyable(const NonCopyable&);
/**
* Private assignment operator
*/
const NonCopyable& operator=(const NonCopyable&);
};
Обратите внимание, что ни один конструктор копирования, ни операторы присваивания имеет реализацию.
Другие ответы здесь правильные. Однако важно отметить, что вы запрещаете только указанный вами код. Кто-то еще может прийти и сделать дубликат вашего класса, используя memcpy или другие стратегии.
Только путем вызова неопределенного поведения. – 2010-01-19 17:40:48
На C++ 11, я понимаю, что предпочтительным решением является использование the '= delete' construct:
class MyClass {
MyClass (const MyClass&) = delete; // Disable copy constructor
MyClass& operator=(const MyClass&) = delete; // Disable assignment
...
}
Тогда
MyClass me;
MyClass you;
me = you; // won't compile
, как правило, копия ctor также должна быть отключена, чтобы избежать «MyClass me = you;». –
@Nick D, мне не нужна копия ctor, хотя бы передать MyClass функции? Или я должен просто использовать 'const MyClass &' в этом случае? – BeeBand
@BeeBand Вы всегда должны переходить по ссылке const. И если вам действительно нужно пройти по значению, вам, вероятно, придется назначить также. – 2010-01-19 13:28:44