在建組件類的時候,習慣性的使用Pimpl(pointer to implementation, 指向實現的指針)慣用法。目的是降低耦合、信息隱藏、接口與實現分離。至於很多資料裏提到的”降低編譯依賴、提高編譯速度”個人沒有清晰的感受,可能是項目規模的原因,這裏只當一個可能提出。因爲是指針的緣故,爲了確保內存的釋放,使用了智能指針std::tr1::shared_ptr,這是C++標準庫提供的方法。建立一個接口類類似下面:
class CImpW;
class CINIFILE_API CCIniFileW
{
///////////////////////////////////////////
具體接口內容,省略……
///////////////////////////////////////////
private:
std::tr1::shared_ptr<CImpW> m_pImp;
};
工程會生成一個dll文件,但是IDE會發出一個警告:
這個警告是說有對象沒有導出,客戶調用類的時候可能出現錯誤。我理解的是調用CImpW類會出現錯誤,但是在這裏,我這麼寫的目的就是不給客戶調用的,所以這個警告在弄清楚之後就直接忽略了。
有一些人可能有強迫症,消除一切的warning。這裏有幾種方法:
- 降低編譯器的警告級別,或者直接不提出警告。個人不建議這做,因爲我認爲“編譯器遠比你更清楚代碼怎麼執行的,除非那是你自己寫的編譯器”。顯然,99.99%的人都是用的別人的東西,然後這個忽略就會自己坑自己了,被坑過的可以自己回憶下。
- 強制關掉特定警告。這個只有在明確了警告含義,並且很清楚的知道忽略警告不會產生不良後果或者不良後果正是你所預期的。才建議這麼做。這個有點符合我的情況,所以在頭文件中添加“#pragma warning(disable:4251)”
- 導出編譯器讓你導出的所有對象。C++中這個STL智能指針對象嵌套了很多的類和對象,我感覺實在是太麻煩了就沒有做(實際上,試圖這麼做過,但是放棄了)。