3 규칙 ( 새로운 c ++ 표준에서 5 규칙 )은 다음과 같습니다.
소멸자, 복사 생성자 또는 복사 할당 연산자를 명시 적으로 선언해야하는 경우 세 개 모두 명시 적으로 선언해야합니다.
그러나 Martin의 " Clean Code "는 빈 생성자와 소멸자를 모두 제거하도록 조언합니다 (293 페이지, G12 : Clutter ).
구현이없는 기본 생성자는 어떤 용도로 사용됩니까? 의미없는 아티팩트로 코드를 복잡하게 만드는 것입니다.
그렇다면이 두 가지 반대 의견을 처리하는 방법은 무엇입니까? 빈 생성자 / 소멸자가 실제로 구현되어야합니까?
다음 예제는 내가 의미하는 바를 정확하게 보여줍니다.
#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;
}
g ++ 4.6.1을 사용하여 다음과 같이 잘 컴파일합니다.
g++ -std=c++0x -Wall -Wextra -pedantic example.cpp
에 대한 소멸자 struct A
는 비어 있으며 실제로 필요하지 않습니다. 그렇다면, 아니면 제거해야합니까?
virtual ~base () = default;
컴파일하지 않습니다 (타당한 이유가 있습니다)
auto_ptr
어느 쪽 도 사용해서는 안됩니다 .