다음은 boost 의 일부 코드이다.
정말 간단한 코드로 객체의 복사를 금지하는 정책을 구현할수 있다.
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