我正在开发一个必须在 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));
有什么想法吗?
最佳答案
同样的事情:)
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 公开的接口(interface)必须相同。在此示例中,_object
将是定义接口(interface)的抽象基类,然后 LinuxObject 和 WindowsObject 将实现该接口(interface),将特定于平台的内容隐藏在它们的实现文件中。
示例
_object.h
class _object
{
public:
virtual void doSomething() = 0;
}; // eo class _object
Windows对象.h
#include "_object.h"
class WindowsObject : public _object
{
public:
virtual void doSomething();
}; // eo class WindowsObject
Windows对象.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 调用),您最好使用一个与平台无关的对象并在实现中放置守卫.当存在巨大差异时,此解决方案更有意义。
关于c++ - linux-windows跨c++应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4186643/