La règle de 3 ( la règle de 5 dans la nouvelle norme c ++) stipule:
Si vous devez déclarer vous-même explicitement le destructeur, le constructeur de copie ou l'opérateur d'affectation de copie, vous devez probablement déclarer explicitement les trois.
Mais, d'autre part, le " Clean Code " de Martin conseille de supprimer tous les constructeurs et destructeurs vides (page 293, G12: Clutter ):
À quoi sert un constructeur par défaut sans implémentation? Tout ce qu'il sert à faire est d'encombrer le code avec des artefacts sans signification.
Alors, comment gérer ces deux opinions opposées? Faut-il vraiment implémenter des constructeurs / destructeurs vides?
L'exemple suivant montre exactement ce que je veux dire:
#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;
}
Compile bien en utilisant g ++ 4.6.1 avec:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
Le destructeur pour struct A
est vide et n'est pas vraiment nécessaire. Alors, devrait-il être là ou devrait-il être supprimé?
virtual ~base () = default;
ne compile pas (pour une bonne raison)
auto_ptr
non plus.