den*_*are 15 c++ cross-platform header-files
我听说编写跨平台c ++代码的方法是按如下方式定义类(例如,一个Window类):
window.h
window_win32.cpp
window_linux.cpp
window_osx.cpp
Run Code Online (Sandbox Code Playgroud)
然后相应地选择实现文件.但是如果我有那个类的成员相对于操作系统怎么办?就像HWNDWin32实现的成员一样.我不能把它放在window.h或者当我试图在Linux上编译它时,它会产生编译器错误.
我需要#ifdef它吗?我已经问了一个类似的问题,但是这个问题更关注这个问题.
小智 26
有更多方法可以解决这个问题 - 每个方法都有它的优点和缺点.
1.)使用宏#ifdef,#endif
// Note: not sure if "WINDOWS" or "WIN32" or something else is defined on Windows
#ifdef WINDOWS
#include <window.h>
#else
// etc.
#endif
class MyClass
{
public:
// Public interface...
private:
#ifdef WINDOWS
HWND m_myHandle;
#else
// etc.
#endif
};
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
2.)正如已经写过的那样,你可以使用多态:
// IMyClass.h for user of your class:
class IMyClass
{
public:
virtual ~IMyClass() {}
virtual void doSomething() = 0;
};
// MyClassWindows.h is implementation for one platform
#include <windows.h>
#include "IMyClass.h"
class MyClassWindows : public IMyClass
{
public:
MyClassWindows();
virtual void doSomething();
private:
HWND m_myHandle;
};
// MyClassWindows.cpp implements methods for MyClassWindows
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
3.)PIMPL习语.
// MyClass.h
class MyClass
{
public:
MyClass();
void doSomething();
private:
struct MyClassImplementation;
MyClassImplementation *m_impl;
}
// MyClassWindows.h
#include <windows.h>
#include "MyClass.h"
struct MyClassImplementation
{
HWND m_myHandle;
void doSomething();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,MyClassImplementation保留所有需要的(至少是特定于平台的)数据并实现所需(再次,特定于平台).在MyClass.cpp中,你包括特定于平台的实现(方法可以是内联的),在构造函数中(或者稍后如果你想 - 只是要小心)你分配实现,在析构函数中你将销毁它.
优点:
缺点:
4.)定义一个中性类型,它足以保存您的数据.例如long long int.
// MyClass.h
class MyClass
{
public:
MyClass();
void doSomething();
private:
typedef unsigned long long int MyData;
MyData m_data;
};
Run Code Online (Sandbox Code Playgroud)
在实现中(例如MyClassWindows.cpp),您总是需要在MyClass :: MyData和存储的实际数据之间进行转换(重新解释转换).
优点:
缺点:
因此,使用最符合您问题的那个...以及您的个性:3因为今天的力量在速度和空间方面都差不多相对相等.
我只会在@Laethnes 的回答中添加一个 5) 项目符号
5) 编写一个空头文件,在编译时包含平台头文件,并在 typedef 下隐藏特定于平台的类
// MyClass.hpp
#if defined(WINDOWS)
# include "WINMyClass.hpp"
typedef WINMyClass MyClass
#elif defined(OSX)
# include "OSXMyClass.hpp"
typedef OSXMyClass MyClass
... // keep going
#endif
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
| 归档时间: |
|
| 查看次数: |
7092 次 |
| 最近记录: |