Linux的Windows跨C ++应用程序

我正在开发一个必须在Linux和Windows上运行的应用程序。 我有一个obj对象,我想在代码中使用,它在Linux和Windows上有不同的行为。 所以我inheritance了aaa并为Windows对象和LinuxObj for Linux对象调用了WindowsObj。

我的问题是:如何在代码中使用这个对象? 我必须写什么来运行Linux和Windows?

对于swichingtypes,我使用typedef

typedef uint32_t DWORD; 

但我有什么用于对象? 我想写这个代码:

 tr1::shared_ptr<WindowsObj> windowsobj (new WindowsObj(parameter)); tr1::shared_ptr<LinuxObj> linuxobj (new LinuxObj(parameter)); 

任何想法?

Solutions Collecting From Web of "Linux的Windows跨C ++应用程序"

一样的东西 :)

 class _object { }; class WindowsObject : public _object { }; class LinuxObject public _object { }; #if defined(WIN32) typedef WindowsObject Object; #else typedef LinuxObject Object; #endif Object myObject; 

编辑:自然,WindowsObject和LinuxObject暴露的接口必须是相同的。 在这个例子中, _object是一个定义接口的抽象基类,然后LinuxObject和WindowsObject将实现这个接口,将特定于平台的东西隐藏在它们的实现文件中。

样品

_object.h

 class _object { public: virtual void doSomething() = 0; }; // eo class _object 

WindowsObject.h

 #include "_object.h" class WindowsObject : public _object { public: virtual void doSomething(); }; // eo class WindowsObject 

WindowsObject.cpp

 #if defined(WIN32) #include <windows.h> void WindowsObject::doSomething() { // do something totally reliant on windows here }; // eo doSomething #endif 

然后你可以对LinuxObject.hLinuxObject.cpp做相同的LinuxObject.h ,后者有完全不同的预处理指令。 例如, #if defined(UNIX)或一些这样的风味。 注意WIN32的实施。 那么你会有一些你会用到的核心头文件:

 #if defined(WIN32) #include "WindowsObject.h" typedef WindowsObject Object; #else #include "LinuxObject.h" typedef LinuxObject Object; #endif 

现在,在你的程序中

 Object a; a.doSomething(); 

值得注意的是,如果只是复杂对象中不同的代码(例如初始化,销毁时的初始化调用),那么使用一个与平台无关的对象可能会更好,并且在实现中放置警卫。 当这个解决方案存在巨大差异时更有意义。

我倾向于使用条件编译,例如

 #ifdef WIN32 // windows-specific code #else // non-windows #endif 

我建议使用跨平台框架,如GTK +或wxWidgets,这样你就不必重新发明轮子…

那么,你应该有最少的平台依赖代码,并可能深入你的课堂。 在那里你可以使用#ifdef来有条件地包含Windows或Unix的代码。

您可以在两个不同的.cpp文件中使用两个不同实现的相同头文件; 即使这两个实现需要完全不同的数据成员, PIMPL习惯使这成为可能。 编译Windows时编译并链接一个源代码,编译Linux时编译另一个源代码。

我发现这个有用的一个领域是电子邮件界面。 这两个操作系统发送电子邮件的方法完全不同。

嗨,如果你可以使用C ++,使用boost和size_t类型更好的方法。