C++ linux-windows跨c++;应用

C++ linux-windows跨c++;应用,c++,windows,linux,typedef,C++,Windows,Linux,Typedef,我正在开发一个必须在Linux和Windows上运行的应用程序。 我想在代码中使用一个名为obj的对象,它在Linux和Windows上有不同的行为。所以我继承了aaa,并为Windows对象调用了WindowsObj,为Linux对象调用了LinuxObj 我的问题是:如何在代码中使用这个对象?我必须写些什么才能让它同时在Linux和Windows上运行 对于切换类型,我使用typedef,例如: typedef uint32_t DWORD; 但是,我必须为对象使用什么呢? 我

我正在开发一个必须在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));
tr1::shared_ptr windowsobj(新windowsobj(参数));
tr1::shared_ptr linuxobj(新的linuxobj(参数));

有什么想法吗?

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

然后,您应该拥有尽可能少的依赖于平台的代码,并且可能深入到类内部。在这里,您可以使用ifdef有条件地包含Windows或Unix的代码。

同样的事情:)

编辑:当然,WindowsObject和LinuxObject公开的界面必须相同。在本例中,
\u object
将是定义接口的抽象基类,然后LinuxObject和WindowsObject将实现此接口,将平台特定的内容隐藏在其实现文件中

样本

_对象.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
现在,在你的程序中

Object a;
a.doSomething();

值得注意的是,如果只是复杂对象中的一行代码不同(比如初始化、销毁时的init调用),那么最好使用单个平台无关对象,并在实现中设置防护。当存在巨大差异时,此解决方案更有意义。

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

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

>如果你可以使用C++,使用Boost和SsieZyt类型的方法更好。

< P>你可以在两个不同的CPP文件中使用两个不同的实现头文件。即使这两个实现需要完全不同的数据成员,也可以使用。在为Windows编译时,只需编译并链接一个源代码,而在为Linux编译时,只需编译并链接另一个源代码


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

Mmm,这样就可以编译和链接两个代码库。我更喜欢一个“平台不可知”对象,其中包含#ifdef,仅适用于与平台相关的部分。@向导-然后您也可以使用typedef-s绕过类声明/定义。但您应该在两种平台上编译—两个不同的版本。@向导,我想这取决于它们的不同程度。如果存在一些“这里和那里”的差异,那么单一的“平台不可知”方法是可行的,但如果差异很大,那么每两行定义一个不凌乱的
#实现就更具可读性。这真的取决于差异。这似乎是一个很好的方法,但在我看来,所有代码以任何一种方式编译的问题都有点糟糕。我完全同意Moo Juice的观点。我认为,如果您为这件
#ifdef
事情的win32和*nix部分编写相同的类名,这将是一个不错的选择。是的。正如其他人所评论的,最好的方法取决于两种实现之间的差异有多大。以
uint
DWORD
为例,他询问如何为自己的复杂类实现类似的功能;你有aaa级。不能从对象继承。对象是类的实例。
Object a;
a.doSomething();
#ifdef WIN32
// windows-specific code
#else
// non-windows
#endif