也許只是一些技巧而已,不過值得反覆重用就變成語言的idioms 了。說到idioms,posa 認
為pattern 可以分為三個層次(或者粒度),architecture patterns、design patterns、programming
language idioms。也就是說idioms 很多是跟語言相關的。
1、實現抽象類(不允許例項化)
這個可能大家都知道,把建構函式宣告為protected 。(當然如果類中包含純虛函式自然就不
能例項化,但是有的抽象類需要為虛函式提供預設實現,因此可能不包含純虛函式。)
2、實現final 類(不允許被派生)
namespace private
friend class nonderivable;
#ifdef ndebug
#define final_class
#else
#define final_class : private virtual private::nonderivablehelper
#endif
class nonderivable final_class
這裡namespace並非必須,只是乙個比較好的習慣而已。
3、實現禁止拷貝構造和賦值操作符
class myclass
private:
myclass(const myclass& );
const myclass& operator = ( const myclass& );
為了防止成員函式呼叫操作,這兩個函式應該只有宣告沒有實現。
c++中的idioms 很多很多,比如typetraits、smartpointer 這些都可以視為經典的 idioms 。注:關於第二個實現 final 類的方式,只要是 virtual繼承即可,至於是 private、protected
還是 public關係不大。在 comp.lang.c++.moderated (2001/5/15)上,andrei alexandrescu 有他
的見解,他不贊成上面文章中使用的 friend-based 方式,直接去掉 friend 那一行,這時必須採用
private virtual 繼承方式。private virtual 繼承確實使得 沒有任何類 能只繼承
nonderivable。
class d: public nonderivable
d() {} //編譯錯誤
不過多重虛擬繼承又繞了過去
class d final_class, public nonderivable
d() {} //一切正常
andrei alexandrescu 又提出了乙個非常巧妙的辦法:把 private::nonderivablehelper
的建構函式加乙個引數,改為 nonderivablehelper(int) {},然後把 nonderivable 的
建構函式寫成 nonderivable(): nonderivablehelper(0) {}
#ifdef ndebug
#define final_class
#else
#define final_class : private virtual private::nonderivablehelper
#endif
namespace private
class nonderivablehelper
protected:
nonderivablehelper(int) {} //added ctor argument
class nonderivable final_class
public:
nonderivable() : nonderivablehelper(0) {} //pass a dummy value
WinForm中的幾個小技巧
遮蔽窗體右上角關閉按鈕 一 重寫onclosing protected override void onclosing canceleventargs e 二 重寫wndproc protected override void wndproc ref message m base.wndproc r...
jquery中幾個小技巧
再次小結若干個jquery的小技巧 1 使用load載入 可以使用load去載入外部檔案 load files 2 讓使用者自由的改動字型 document ready function 減少字型大小 decreasefont click function 重新恢復字型大小 resetfont cl...
幾個C 程式設計的小技巧 二
幾個c 程式設計的小技巧 二 一 判斷檔案或資料夾是否存在 使用system.io.file,要檢查乙個檔案是否存在非常簡單 bool exist system.io.file.exists filename 如果需要判斷目錄 資料夾 是否存在,可以使用system.io.directory boo...