2010-01-19 7 views

ответ

15

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); 
    ... 
}; 

, который легко читать и легко найти.

+6

, как правило, копия ctor также должна быть отключена, чтобы избежать «MyClass me = you;». –

+0

@Nick D, мне не нужна копия ctor, хотя бы передать MyClass функции? Или я должен просто использовать 'const MyClass &' в этом случае? – BeeBand

+0

@BeeBand Вы всегда должны переходить по ссылке const. И если вам действительно нужно пройти по значению, вам, вероятно, придется назначить также. – 2010-01-19 13:28:44

9

объявить оператора присваивания private.

8

Да - определить частный оператор назначения (operator=) или получить из удобного класса boost::noncopyable.

+0

Это на самом деле 'подталкивание: noncopyable' без подчеркивания. – fredoverflow

+0

Упс. Приветствую Фреда. – Rob

2

Использование const.

MyClass const me; 
MyClass you; 
me = you; // compilation error 
1

Я использую для вывода своих неопубликованных классов из общего класса 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&); 
}; 

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

0

Другие ответы здесь правильные. Однако важно отметить, что вы запрещаете только указанный вами код. Кто-то еще может прийти и сделать дубликат вашего класса, используя memcpy или другие стратегии.

+1

Только путем вызова неопределенного поведения. – 2010-01-19 17:40:48

1

На 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 
Смежные вопросы