2010-06-21 12 views

Respuesta

11

Puede declarar estas funciones como privadas, lo que evita que las personas las usen cuando trabajan con su clase y al mismo tiempo impide que el compilador las genere.

+0

Tenga en cuenta que esto no evitará la * declaración * de dichas funciones, ya que las acaba de declarar usted mismo, y el compilador puede considerarlas cuando corresponda. –

2

¿Definir? Bueno, sí. Siempre son declarados (explícitamente por usted o implícitamente por el compilador), pero solo son definidos por el compilador cuando/si realmente los usa. No los use, y el compilador no los definirá.

Por supuesto, si por "impedir que los compiladores de definir ...", que quiere decir "evitar que los compiladores de éxito definir ...", es decir, si usted quiere hacer el intento de definición implícita fallar en tiempo de compilación, a continuación, puede lograrlo agregando un subobjeto no copiable y/o no asignable a su clase (como una base o un miembro con copia privada-constructor y operador de asignación privada, por ejemplo).

+0

@Matthieu M .: En primer lugar, ¿qué es "no necesariamente"? El miembro 'const' es un subobjeto no asignable. En segundo lugar, lo que dices no es del todo correcto. La asignación de copia es * siempre declarada *. Es el intento de * definición * el que fallará en el caso de un miembro 'const', tal como dije en mi respuesta. – AnT

6

Sí. Derivar de boost :: noncopyable.

(También hay maneras NIH de hacerlo, al declarar los métodos privados nunca definidos para operator = y copy constructor, pero, por favor, encanta boost).

3

Declare esas funciones usted mismo y haga que sean privadas. También puede escribir definiciones de esas funciones, por lo que todos los que intenten usar esas funciones obtendrán un error de enlazador.

1

Heredar de un tipo que declara esas funciones en el ámbito privado, como boost :: noncopyable.

O ... tienen una variable miembro de referencia: P

0

Fwiw si alguna vez tienes alrededor para usar Qt continuación, puede utilizar la macro Q_DISABLE_COPY:

class Foo 
{ 
public: 
    Foo(); 

private: 
    Q_DISABLE_COPY(Foo) 
}; 
3

En C++ 0x, se 'll ser capaz de escribir

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

Tenga en cuenta que el compilador no generará convertir NonCopyable::operator=(Other const&) sobrecargas en cualquier caso.

+0

Obtiene mensajes de error mucho más agradables de esta manera, al menos en mi opinión. –

Cuestiones relacionadas