2011-03-19 13 views
5

Digamos que tengo clase con N miembros. La mayoría de los miembros son copiables. Solo un miembro necesita un código de copia manual.¿Es posible escribir el operador de asignación de constructor solo mencionando miembros con copia especial?

¿Hay algún método para escribir el operador de asignación de copias de forma que escriba código solo para miembros no estándar y deje que el compilador genere código de copia para todos/otros miembros?

+0

* ¿Por qué * ese miembro necesita un código de copia manual? – GManNickG

Respuesta

11

Sí, por supuesto, envuelva su miembro en una clase separada con un constructor de copias definido por el usuario. Y para la clase de la que está hablando, no escriba constructor de copia definido por el usuario.

E.g.

class MyMemWrapper 
{ 
    define copy constructor 
}; 

class MyClass 
{ 
    member 1; 
    member 2; 
    ... 
    MyMemWrapper 
}; 
+1

Increíble, pero ¿por qué no heredas MyClass de MyMemWrapper en lugar de hacerlo miembro? –

+1

+1 Solo la respuesta correcta. No estoy seguro de por qué la gente se pasa tanto por esto: si le pregunto "Tengo una clase con N miembros, pero uno es un puntero, así que tengo que darle la semántica correcta, ¿puedo escribir mi operador de asignación para no necesitarlo? para tocar los N miembros? ", la gente nunca sugiere las clases base o las estructuras de agrupación de miembros o el" no "a toda máquina, sugieren un puntero inteligente. Esto no es diferente: * envuelva el recurso *! ¿Por qué un recurso con semántica de valores especiales está fuera de su envoltorio? – GManNickG

+1

@ Mr.TAMER: ¿Por qué? Quiero que mi recurso sea un miembro, no una base. – GManNickG

1

No, si se reemplaza el operador de asignación de copia, el compilador no generará método operador de asignación de copia predeterminado para copiar los miembros estándar, como se pretendía.

Cuestiones relacionadas