2010-01-19 10 views

Respuesta

15

declarar el operador de asignación privada:

class A { 
    private: 
    void operator=(const A&); 
    ... 
}; 

pero no proporcionan una implementación - obtendrá un error de compilación o de tiempo de enlace si intenta realizar una asignación a A.

Prefiero usar una macro para hacer esto. Esto también impide la copia, haciendo que el constructor de copia privada también:

#define CANNOT_COPY(class) \ 
    private:     \ 
    class(const class&); \ 
    void operator=(const class &) \ 

A continuación, puedo decir cosas como:

class A { 
    CANNOT_COPY(A); 
    ... 
}; 

que es fácil de leer y fácil de buscar.

+6

generalmente, el copiador también debe deshabilitarse para evitar el caso 'MyClass me = you;'. –

+0

@Nick D, ¿No necesito una copiadora para pasar 'MyClass' a una función? ¿O debería usar 'const MyClass &' en este caso? – BeeBand

+0

@BeeBand Siempre debe preferir pasar por referencia constante. Y si realmente necesita pasar por valor, es probable que necesite asignar también. –

9

declarar el operador de asignación como private.

8

Sí - defina un operador de asignación privada (operator=) o derive de la práctica clase boost::noncopyable.

+0

En realidad es 'impulso: noncopyable' sin el subrayado. – fredoverflow

+0

¡Uy! Saludos Fred. – Rob

2

Usar const.

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

Utilizo para derivar mis clases no copiables de una clase común no copiable. Si no se utiliza impulso, por lo general utilice este atajo:

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

Tenga en cuenta que ni el constructor de copia, ni los operadores de asignación tienen una implementación.

0

Las demás respuestas aquí son todas correctas. Sin embargo, es importante tener en cuenta que solo está prohibiendo el código específico que mencionó. Alguien puede seguir y hacer un duplicado de tu clase mediante el uso de memcpy u otras estrategias.

+1

Solo invocando un comportamiento indefinido. –

1

A partir de C++ 11, mi entendimiento es que la solución preferida es utilizar the '= delete' construct:

class MyClass { 
    MyClass (const MyClass&) = delete; // Disable copy constructor 
    MyClass& operator=(const MyClass&) = delete; // Disable assignment 
    ... 
} 

Entonces

MyClass me; 
MyClass you; 
me = you; // won't compile 
Cuestiones relacionadas