2017年12月26日 星期二

靜態多型

相對於靜態多型就是一般較多使用的的動態多型,如:
class Base
{
public:
  virtual void f() = 0;
};
class Derived :public Base
{
  virtual void f() override
  {
  }
public:
};
若改為靜態多型可能會像以下這樣:
template<typename DERIVED>
class Base
{
public:
  void f()
  {
    static_cast<DERIVED*>(this)->f_Imp();
  }
};
class Derived :public Base<Derived>
{
  void f_Imp()
  {
  }
public:
  friend class Base<Derived>;
};

2017年12月25日 星期一

[分享]template 參數的 class 和 typename 還是有差別

若是要做 class 用,就明確指名 class 吧

// template<typename H> 這在 vs2015 過不了
template<class H>
class A
{
  void f()
  {
    cout << "OK" << endl;
  }
public:
  friend H;
};
class B
{
public:
  void f()
  {
    On_a.f();
  }
  A<B> On_a;
};

2017年12月23日 星期六

[轉貼]強制實作

此文截取自 http://www.programmer-club.com.tw/ShowSameTitleN/c/46861.html

用一個範例做個總結,也感謝 coco 提供的 assert,在 C++ 沒有提供 must 繼承實作之下,還能做到類似的效果,讓程式簡潔不少。但問題由原本的強制繼承實作,變成須強制 assert 實作,更不好達成,由此看出 must 繼承實作的須要性

範例主要展示 prototype pattern 及 visitor pattern 的架構,不過 visitor pattern 做了改良,可以
採用 ClassID 做配對,可以在執行時期做較機動的處理,但為了減少篇幅和難度,還是寫死未做較機動的
處理

Class C 是為了表現未強制實作的後果,有幾處做了 remark,把 remark 的地方恢復,就可正常執行

2017年12月9日 星期六

CMRegSelf 插件註冊輔助

這是一個輔助性的插件,幫忙減輕 cxxlObjectPlugin 插件註冊的繁雜規劃,也減輕應用程式註冊插件的負擔。為此,CxxlMan2 的標準插件 CxxlMan2Plugin 全部修改成全面支援 CMRegSelf。

CMRegSelf 的機制在於讓 CxxlMan2Plugin 插件檔(dll 檔)有自我註冊插件的能力,並提供主程式註冊這些插件檔的功能。同時也提供一個範例,以期能完全瞭解這些運作。

注意!由於不同系列編譯器編碼的差異(比如 vc 與 gcc),不要把它們放置在一起或同一個插件搜尋路徑中,否則註冊處理時會有當掉的危險。所以內定的 CxxlMan2Plugin 資料夾也要有分別,比如分成 C:\CxxlMan2Plugin_vc 和 C:\CxxlMan2Plugin_gcc

下載點:
CMRegSelf_Src_20221110.zip

2017年10月12日 星期四

用 C++11 完美詮釋 Decorator pattern

Decorator UML class diagram.svg

By Trashtoy - My own work, written with text editor., Public Domain, Link

Decorator pattern 的類圖表明了所有處理、使用的對象都是 Component 介面,能夠操作的只有 Component 開放的功能,也就是 operation(),任何 Component 的實作類別都必須依自己的情況實作 operation()。其中有一個 Component 的延伸介面 Decorator,對 operation() 有一個明確的定義--除了做自己的事之外,還要呼叫的包裹對象的 operation()。

2017年10月3日 星期二

介面繼承 與 組合代替繼承

此文延伸自「虛擬函數多層強制實作」一文,若解說上有不明究理的地方可以先回頭看看。

在「虛擬函數多層強制實作」提到用 PROTOTYPE_BASE_CRTP 這個巨集來取代直接繼承的做法,可強制子孫類別都得強制實作某些虛擬函數,可是現在問題是如何強制必須使用這個巨集,所以只是把一個難題換成另一個難題而已。

所以還是得回歸 C++ 本身,C++ 只提供一層的強制實作,這應該有個光明正大的理由,文章最後有個看法也許可以成立。

PROTOTYPE_BASE_CRTP 巨集只是利用 C++ 的多重繼承在每個子孫類別再繼承一次純虛擬函數,以達到強制實作的目的,若這方式不可行,還有其它的方法嗎?

C++ 的純虛擬函數一次性實作,只要不實作就可以不斷的延續到子孫類別,所以只要採用「介面繼承」的方式就可以達到強制實作的目的。但類別資料繼承的部份要怎麼解決,不是程式設計界有句名言「組合代替繼承」,就用這兩招來試試。

2017年8月3日 星期四

虛擬函數多層強制實作

這裡留下 http://www.programmer-club.com.tw/ShowSameTitleN/c/46861.html 的討論結果。

C++ 的純虛擬函數只能強制實作一層,若希望多層的實作類別都必須實作,C++ 並沒有支援,以下示範如何建立多層強制實作的機制

2017年5月6日 星期六

碎形幾何測試程式




以上影片說的是碎形幾何,若覺得手癢也想試試,以下的程式可幫上一點忙。

程式使用到 CxxlMan2 程式庫,可到 http://blog.cxxl3d.tk/2015/10/cxxlman2-class-lib.html 下載,不過只用到 cxxlcommon\include 內的引入檔,所以不用編譯這個程式庫,只要把 THREADMGR.HPP 所在的完整路徑加到 include path 就可以了。

程式在 Win10 用 vs2015 和 MinGW 6.3 編譯跑過沒有問題,程式只是一個架構,把程式碼整個複製貼上就能用了。

2017年4月30日 星期日

替死鬼模式

cxxlObject 物件須所有持有者放棄才會結束,若有特殊的持有者不會主動放棄,而是要等其他所有持有者放棄之後才會跟者放棄。

這時就有難題了,要怎麼知道其他持有者都放棄了,這時替死鬼就派上用場了,特殊的持有者仍持有該物件,其他持有者則改持有替身,等所有持有者放棄替身後,再由替身去要求特殊的持有者放棄該物件。

2017年1月7日 星期六

[轉傳]修改 subversion log 訊息

http://askalee.blogspot.tw/2006/11/subversion-log.html

在 Windows 系統下用 TortoiseSVN,到 TortoiseSVN repository 的 hooks 目錄中,新增或編輯一個名為 pre-revprop-change.bat 的檔案,內容改為

  exit 0

即可