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