linux-windows跨c++应用
Posted
技术标签:
【中文标题】linux-windows跨c++应用【英文标题】:linux- windows cross c++ application 【发布时间】:2010-11-15 16:39:44 【问题描述】:我正在开发一个必须在 Linux 和 Windows 上运行的应用程序。 我有一个名为 obj 的对象,我想在代码中使用它,它在 Linux 和 Windows 上具有不同的行为。所以我继承 aaa 并为 Windows 对象调用 WindowsObj,为 Linux 对象调用 LinuxObj。
我的问题是:如何在代码中使用这个对象?我要写什么才能让它同时运行在 Linux 和 Windows 上?
对于切换类型,我使用 typedef,例如:
typedef uint32_t DWORD;
但是我必须为对象使用什么? 我想写这段代码:
tr1::shared_ptr<WindowsObj> windowsobj (new WindowsObj(parameter));
tr1::shared_ptr<LinuxObj> linuxobj (new LinuxObj(parameter));
有什么想法吗?
【问题讨论】:
你没有对象aaa;你有一个AAA级。您不能从对象继承。对象是类的一个实例。 【参考方案1】:同样的事情:)
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
做同样的事情,后者有完全不同的预处理器指令。例如,#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();
值得注意的是,如果只是奇怪的代码行在您的复杂对象中有所不同(例如初始化时的 init 调用、销毁),您可能最好使用一个与平台无关的对象并在实现中设置保护.当存在巨大差异时,此解决方案更有意义。
【讨论】:
嗯,这样代码库就会被编译和链接。我更喜欢单个“平台无关”对象,其中包含#ifdef,仅适用于平台相关部分。 @Wizard - 那么你也可以使用 typedef-s 来处理类声明/定义。但是你应该在两个平台上编译——两个不同的版本。 @Wizard,我想这取决于它们的不同之处。如果存在一些“这里和那里”差异,则单一的“平台无关”方法可以工作,但如果差异很大,那么每两行没有#if defined
混乱的两个实现更具可读性。这真的取决于差异。
这似乎是一个很好的方法,但在我看来,所有代码都被编译的问题有点糟糕
完全同意 Moo-Juice【参考方案2】:
我倾向于为此使用条件编译,例如
#ifdef WIN32
// windows-specific code
#else
// non-windows
#endif
【讨论】:
我认为如果你为这个#ifdef
事物的 win32 和 *nix 部分编写了相同的类名,那就没问题了。
是的。正如其他人评论的那样,最好的方法取决于两种实现之间的差异。【参考方案3】:
我建议使用跨平台框架,例如 GTK+ 或 wxWidgets,这样您就不必重新发明***...
然后,您应该拥有最少可能依赖于平台的代码,并且可能深入到您的类中。在那里,您可以使用#ifdef
有条件地包含适用于 Windows 或 Unix 的代码。
【讨论】:
【参考方案4】:您可以在两个不同的 .cpp 文件中使用具有两个不同实现的同一个头文件; PIMPL idiom 使这成为可能,即使这两种实现需要完全不同的数据成员。在为 Windows 编译时,您只需编译并链接一个源代码,而在为 Linux 编译时,您只需编译和链接另一个源代码。
我发现这很有用的一个领域是电子邮件界面。两种操作系统发送电子邮件的方法完全不同。
【讨论】:
【参考方案5】:您好,如果您可以使用 c++,请使用 boost 和 size_t 输入更好的方法。
【讨论】:
阅读问题。以uint
和DWORD
为例,他在问如何为自己的复杂类实现类似的事情。以上是关于linux-windows跨c++应用的主要内容,如果未能解决你的问题,请参考以下文章