Zasada 3 ( zasada 5 w nowym standardzie c ++) stanowi:
Jeśli musisz samodzielnie zadeklarować niszczyciel, konstruktor kopii lub operator przypisania kopii, prawdopodobnie musisz jawnie zadeklarować wszystkie trzy z nich.
Ale z drugiej strony „ Czysty kod ” Martina zaleca usunięcie wszystkich pustych konstruktorów i destruktorów (strona 293, G12: Clutter ):
Jakie zastosowanie ma domyślny konstruktor bez implementacji? Wystarczy zaśmiecać kod bezsensownymi artefaktami.
Jak więc poradzić sobie z tymi dwiema przeciwnymi opiniami? Czy naprawdę należy wdrożyć puste konstruktory / destruktory?
Następny przykład pokazuje dokładnie, co mam na myśli:
#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;
}
Kompiluje się dobrze przy użyciu g ++ 4.6.1 z:
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
Destruktor struct A
jest pusty i nie jest tak naprawdę potrzebny. Czy powinien tam być, czy powinien zostać usunięty?
virtual ~base () = default;
nie kompiluje się (bez uzasadnionego powodu)
auto_ptr
.