當然,我知道最好的答案是「不要編寫自己的跨平臺代碼,有人已經完成了你需要的東西」,但是我將其作爲一種愛好/學習鍛鍊而不是以任何有償能力。基本上,我正在用C++編寫一個小型的控制檯應用程序,並且我想讓它跨平臺,處理諸如文件,套接字和線程之類的東西。 OOP似乎是一種很好的方式來處理這個問題,但我還沒有真正找到一種編寫共享相同接口跨平臺的類的好方法。C++中的跨平臺OOP
簡單的方法是隻規劃一些元接口,在整個程序的其餘部分使用它,然後根據平臺編譯同一個類,並使用不同的文件,但是我覺得應該有更好的更優雅的方式;至少,不會混淆IntelliSense及其同類的東西會很好。
我已經採取了看看一些在wxWidgets的源較小的類,並且採用了可使用專用構件保持數據的類的方法,如
class Foo
{
public:
Foo();
void Bar();
private:
FooData data;
};
然後,您可以編譯這個通過簡單地根據平臺選擇不同的實現文件。這種方法對我來說似乎很笨拙。
我考慮的另一種方法是編寫一個接口,並根據平臺交換從該接口繼承的類。事情是這樣的:
class Foo
{
public:
virtual ~Foo() {};
virtual void Bar() = 0;
};
class Win32Foo
{
public:
Win32Foo();
~Win32Foo();
void Bar();
};
當然這種螺絲了實際的實例,因爲你不知道要創建的對象,它的實現,但可以通過周圍使用功能
Foo* CreateFoo();
進行加工的
並根據您運行的平臺改變函數的實現。我也不是這個巨大的粉絲,因爲它仍然看起來笨拙的代碼與一堆實例化方法(這也會與創建非跨平臺對象的方法不一致)。
這兩種方法哪種更好?有沒有更好的辦法?
編輯:爲了澄清,我的問題不是「你如何編寫跨平臺的C++?」相反,它是「什麼是用C++中的類抽象出跨平臺代碼的最好方法,同時儘可能保留類型系統的好處?」
這是個好主意,我一定會看看Boost在那裏做什麼。 雖然我很好奇,這種模式是否允許類的狀態因實現而異?例如,Posix與Win32文件句柄具有不同的類型 - 如果我正在編寫文件包裝器,則狀態結構/類將不得不不同。 – ShZ 2009-12-10 23:34:04
你會創建一個'file_handle'類,並且通常把句柄填入'void *'。實現可以將其轉換回它所需要的。這是由標準保證安全。如果你動態加載實現,這個方法也可以很好地工作,因爲你只需從庫中加載'some_function_pointer'來替換'detail :: whatever'。 – GManNickG 2009-12-10 23:43:08
+1:總是委託給構建系統什麼是構建時間特定的 – 2009-12-11 11:41:10