La regola di 3 ( la regola di 5 nel nuovo standard c ++) afferma:
Se è necessario dichiarare esplicitamente il distruttore, il costruttore della copia o l'operatore di assegnazione della copia, è necessario dichiarare esplicitamente tutti e tre.
D'altra parte, il " codice pulito " di Martin consiglia di rimuovere tutti i costruttori e i distruttori vuoti (pagina 293, G12: Clutter ):
A che serve un costruttore predefinito senza implementazione? Tutto ciò che serve è ingombrare il codice con artefatti insignificanti.
Quindi, come gestire queste due opinioni opposte? I costruttori / distruttori vuoti dovrebbero davvero essere implementati?
Il prossimo esempio dimostra esattamente cosa intendo:
#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 bene usando g ++ 4.6.1 con:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
Il distruttore per struct A
è vuoto e non proprio necessario. Quindi, dovrebbe essere lì o dovrebbe essere rimosso?
virtual ~base () = default;
non compilare (con una buona ragione)
auto_ptr
neanche.