2011-09-30 6 views
5

Estoy un poco confundido al usar "regla de tres" con punteros inteligentes. Si tengo una clase cuyo único miembro de datos es un puntero inteligente, ¿necesito definir explícitamente destructor, constructor de copia y operador de asignación?regla de tres con puntero inteligente?

Según tengo entendido, dado que el puntero inteligente manejará el recurso automáticamente, no es necesario que defina explícitamente el destructor, y por lo tanto no debería necesitar hacerlo para los otros dos basados ​​en la regla de tres. Sin embargo, no estoy seguro de si el constructor de copia predeterminado es lo suficientemente bueno para punteros inteligentes como shared_ptr.

¡Gracias por tu ayuda!

+0

EXP0, es mejor aclarar qué tipo de puntero inteligente usas. ¿Es algo así como std :: auto_ptr, o más como boost :: shared_ptr <>? – Lev

Respuesta

10

El destructor predeterminado está bien, porque el destructor de shared_ptr se ocupará de la desasignación del objeto. El constructor de copia predeterminado puede ser aceptable dependiendo de sus propósitos: cuando copie el objeto que posee el shared_ptr, la copia compartirá la propiedad con el original. Lo mismo sucedería naturalmente con el operador de asignación predeterminado. Si eso no es lo que quiere, defina un constructor de copia que haga lo contrario, por ejemplo, que clone el objeto al que se hace referencia.

+1

Es posible que también desee sobrescribir el operador de asignación.Mover la construcción/mover la asignación debería estar bien –

1

La regla de tres en realidad dice:

Si es necesario definir una versión no trivial de cualquiera de los siguientes:

  1. Destructor
  2. operador de asignación
  3. constructor de copia

... entonces usted probablemente nee d los otros dos también.

Usted parece ser interpretar como:

Si necesita un destructor no trivial, entonces también necesita los otros dos.

Pero eso no es exactamente lo mismo, ¿verdad?

2

En resumen, "no". El objetivo del código de factorización en las clases de responsabilidad única es que puede componer sus clases a partir de bloques de construcción "inteligentes" para que no tenga que escribir ningún código.

considerar lo siguiente:

class Foo 
{ 
    std::shared_ptr<Bar> m_pbar; 
    std::string   m_id; 
}; 

Esta clase tiene automáticamente copia y constructores mover y copiar y mover los operadores de asignación que son tan buenos como se puede conseguir, y todo está cuidado.

Si quieres ser extremo, se podría decir que en la mayoría casos es probable que nunca se debe escribir un destructor o constructor de copia en absoluto - y si lo hace, entonces tal vez debería factor mejor que la funcionalidad en una clase separada con una sola responsabilidad.

Cuestiones relacionadas