다음은 boost 의 일부 코드이다.
정말 간단한 코드로 객체의 복사를 금지하는 정책을 구현할수 있다.
다음과 같이 상속을 통해 구현한다.
또한, boost::noncopyable 를 사용하여 상속을 금지하는 leaf-class (또는 non-inheritance ) 정책도 구현할 수 있다.
virtual 상속을 통해서 구현한다.
따라서 SomeClass 를 그냥 사용할 때에는 별 문제가 없겠지만, 아래와 같이 상속 받는 경우에는 컴파일러가 불만을 내밷을 것이다.
정말 간단한 코드로 객체의 복사를 금지하는 정책을 구현할수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | namespace boost { namespace noncopyable_ // protection from unintended ADL { class noncopyable { protected : noncopyable() {} ~noncopyable() {} private : // emphasize the following members are private noncopyable( const noncopyable& ); const noncopyable& operator=( const noncopyable& ); }; } typedef noncopyable_::noncopyable noncopyable; } // namespace boost |
다음과 같이 상속을 통해 구현한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class SomeClass : private boost::noncopyable { public : // 컴파일러가 만들어 내는 코드는 다음과 갖을 것이다. // boost::noncopyable::protected - 접근 가능 // SomeClass::noncopyable() {} // SomeClass::~noncopyable() {} // boost::noncopyable::private - 접근 불가 // SomeClass::noncopyable( const noncopyable& ); // const SomeClass::noncopyable& operator=( const noncopyable& ); }; int _tmain( int argc, _TCHAR* argv[]) { SomeClass c1, c2; c2 = c1; //< compile error : const noncopyable& operator=( const noncopyable& ); 에 접근할 수 없다. return 0; } |
또한, boost::noncopyable 를 사용하여 상속을 금지하는 leaf-class (또는 non-inheritance ) 정책도 구현할 수 있다.
virtual 상속을 통해서 구현한다.
1 2 3 4 5 | class SomeClass : private virtual boost::noncopyable { public : //< virtual 키워드는 구현 코드의 지연을 의미한다. 따라서 실제 객체를 선언할때에 판별 될 것이다. }; |
따라서 SomeClass 를 그냥 사용할 때에는 별 문제가 없겠지만, 아래와 같이 상속 받는 경우에는 컴파일러가 불만을 내밷을 것이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class DerivedClass : public SomeClass { public : DerivedClass(){} //< compile error : DerivedClass::SomeClass::boost::noncopyable(){} 접근 불가 // SomeClass 가 boost::noncopyable 클래스를 가상 상속 받았기 때문에 아래에 다름과 같은 코드가 생성될 것이다. // boost::noncopyable::protected - 접근 불가(CDerivedClass 가 boost::noncopyable 클래스를 상속 받는게 아니다) // DerivedClass::SomeClass::boost::noncopyable(){} // DerivedClass::SomeClass::boost::~noncopyable(){} // boost::noncopyable::private - 접근 불가(private는 당연히 접근 불가) // DerivedClass::SomeClass::boost::noncopyable( const noncopyable& ); // const DerivedClass::SomeClass::boost::noncopyable& operator =( const noncopyable& ); }; |
'Boost' 카테고리의 다른 글
boost::tokenizer (0) | 2011.03.24 |
---|---|
boost::function (0) | 2011.03.24 |
boost::thread sample code (0) | 2011.03.15 |