2013-02-07 60 views
3

我正在使用C++庫,其中的一部分是我需要的幾個OS函數的抽象層。我開始使用Windows API實現它,但打算使用#ifdef等添加對其他平臺的支持。如何在不污染代碼的情況下包含WinAPI?

然而,開始成爲一個問題的是,包括Windows.h在內的所有其他代碼都會傳播到我不需要它的地方,尤其是因爲它是一個庫,它也會污染其他代碼那些會使用它的人。我真的不介意Windows API是使用命名空間還是一些清晰的方法來區分它的代碼,而是它們#定義了很多很常見的單詞,如小,近,遠(小寫),以及許多函數名稱也相當一般。

所以我真的很喜歡,如果只有我的代碼的平臺特定部分訪問這些,它不會被包括在其他地方。我知道,明顯的解決方案是隻包括WINDOWS.H在CPP文件,但事實並非總是可能的,因爲某些平臺的特定數據類型或結構類的成員變量如:

class Window { 

public: 

    // ... 

private: 
    HWND handle; 

}; 

所以有沒有辦法做到這一點?

謝謝。

+0

您的圖書館是否需要導出任何windows.h定義供您的圖書館用戶使用,或者您的圖書館是否僅在內部使用Win32API,因此只需要導出您的聲明? – franji1

+0

它應該只在內部使用Windows特定功能。 – Detheroc

+1

看來您可以將您的對象重建爲更多的接口/包裝器,客戶端可以在其中調用對象工廠來創建接口的派生實例。派生類包含像HWND等實現細節。 – franji1

回答

6

使用pimpl成語(http://en.wikipedia.org/wiki/Opaque_pointer)。 C++編程語言的侷限性使得有必要使用這樣的技巧來獲得信息隱藏。

這樣做的方法之一就是在C中執行相同的操作(因爲以下原因,您根本沒有這個問題):在頭文件中前向聲明一個結構,在實現文件中定義其內容。

大多數人通過將您的示例的整個私有部分提取到其自己的結構中來完成該結構,該結構的內容僅在實現文件中定義,並且只在頭文件中放置一個指針,作爲現在唯一的成員班級的私人部分。

另外,在#include之前#define WIN32_LEAN_AND_MEAN爲了去掉windows.h給你的東西。

+0

+1這比我準備寫的答案要好:導出一堆「接口」和對象工廠,派生實現類具有HWND類型數據成員,但接口是就是這樣,沒有實現細節 – franji1

+0

好吧,我想我現在得到它,這正是我所期待的,謝謝。 – Detheroc

相關問題