2009年12月17日 星期四

boost::noncopyable

trace到一半忍不住…又忍不住來打混又來跟大家分享了。
還記得陳欠欠之前提到的
雞婆的
C++
嗎?
這篇告訴我們一個該養成的好習慣,防止一些可以避免的錯誤。
我個人很喜歡這種基本功的文章,在學會pattern,refactor的路上,養成這些c++ primer會提到的好習慣(或優良程式設計師間的默契)或許同樣重要。
言歸正傳,自從看過
雞婆的
C++
我長高了~,每當自己開一個class時,會習慣的作些 add #ifdef, copy constructor 保護等動作,這些動作有點像是創造class 的 某個template(而且還會進化),有必要,但有點煩瑣。就在剛剛trace open source時注意到,很多plugin 的class都繼承了一個東西boost::noncopyable,這甚麼? 貼個code來瞧瞧
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


哈,其實就是欠提到的東西,我們把欠之前的code拿來改改玩玩。


#include "boost\noncopyable.hpp"
using   namespace   boost;
class TenBytes : boost::noncopyable
{
public:
    TenBytes() {mTenBytes = new char[10];}
    ~TenBytes() {if (mTenBytes) delete [] mTenBytes;}
private:
    char *mTenBytes;
//TenBytes(const TenBytes &inTenBytes); //done by boost::noncopyable
//TenBytes& operator = (const TenBytes &inTenBytes);
};


一樣的效果。

1 則留言:

  1. boost 有心~
    有時間應該來K一下~
    但不知道有沒有甚麼缺點~(好奇,直覺事情不可能完美的,要平衡報導一下 :P)

    回覆刪除