La regla de 3 ( la regla de 5 en el nuevo estándar de c ++) establece:
Si necesita declarar explícitamente el destructor, el constructor de copia o el operador de asignación de copia usted mismo, probablemente deba declarar explícitamente los tres.
Pero, por otro lado, el " Código Limpio " de Martin aconseja eliminar todos los constructores y destructores vacíos (página 293, G12: Desorden ):
¿De qué sirve un constructor predeterminado sin implementación? Todo lo que sirve para hacer es desordenar el código con artefactos sin sentido.
Entonces, ¿cómo manejar estas dos opiniones opuestas? ¿Deberían implementarse realmente constructores / destructores vacíos?
El siguiente ejemplo demuestra exactamente lo que quiero decir:
#include <iostream>
#include <memory>
struct A
{
A( const int value ) : v( new int( value ) ) {}
~A(){}
A( const A & other ) : v( new int( *other.v ) ) {}
A& operator=( const A & other )
{
v.reset( new int( *other.v ) );
return *this;
}
std::auto_ptr< int > v;
};
int main()
{
const A a( 55 );
std::cout<< "a value = " << *a.v << std::endl;
A b(a);
std::cout<< "b value = " << *b.v << std::endl;
const A c(11);
std::cout<< "c value = " << *c.v << std::endl;
b = c;
std::cout<< "b new value = " << *b.v << std::endl;
}
Compila bien usando g ++ 4.6.1 con:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
El destructor para struct A
está vacío y no es realmente necesario. Entonces, ¿debería estar allí o debería eliminarse?
virtual ~base () = default;
no se compila (con una buena razón)
auto_ptr
.