我正在开发一个必须在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));
任何想法?
一样的东西 :)
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.h
和LinuxObject.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类型更好的方法。