跨平台 C++:将 OS-细节包装在 class 后面
Cross-platform C++: wrapping OS-specifics behind a class
我正在开发一个 C++ 项目,它应该 运行 在 Linux 和 Windows 7+ 上。这也是我在几年前参加了非常简单和简短的基础课程后使用 C++ 的第一周。
假设我需要访问文件系统,但是由于 OS 有不同的 API,我需要创建一个包装器 class 来使事情保持一致。
以下是否可行:
有基础classFile
。我从文件中继承 WinFile
和 LinuxFile
,它们实现了基础 class public 方法(例如 createFile
、readFile
等)。然后在两个子 classes 中,我实现 public 方法以映射到特定于平台的方法(WINAPI 文件处理和 UNIX 文件处理)。
然后我会使用预处理器指令在主应用程序中有条件地加载 WinFile
或 LinuxFile
:
int main()
{
#if defined WIN32
WinFile fileSystem;
#elif defined LINUX
LinuxFile fileSystem;
#endif
// Both of above contain the same public method API.
std::string filedata;
filedata = fileSystem.readFile(...);
...
}
我的直觉告诉我这应该可行,但是有什么缺点吗?这会很容易成为可维护性问题吗?预处理器指令是否被视为 "hacks" 之类的?我知道它们与 header include guards 等一起使用,但它们是与编译器相关的逻辑,而不是与应用程序相关的逻辑。
还有其他方法可以实现我在这里尝试做的事情吗?
您可以在头文件中定义 API 并将实现移动到 cpp 文件中。
添加依赖于您的 os 的 .cpp 源文件(或通过 macros 保护 .cpp 文件,例如:
// File.h
class File
{
public:
void open(std::string);
};
// File_impl_win.cpp (compiled when win)
void File::open(std::string)
{
// impl
}
// File_impl_lin.cpp (compiled when linux)
void File::open(std::string)
{
// impl
}
优点是您不需要区分 LinuxFile 和 WindowsFile,您只需要一个 api。
但是已经有一个很棒的 crossplatform boost 文件系统使用库,boost filesystem,您可以使用它。
我正在开发一个 C++ 项目,它应该 运行 在 Linux 和 Windows 7+ 上。这也是我在几年前参加了非常简单和简短的基础课程后使用 C++ 的第一周。
假设我需要访问文件系统,但是由于 OS 有不同的 API,我需要创建一个包装器 class 来使事情保持一致。
以下是否可行:
有基础classFile
。我从文件中继承 WinFile
和 LinuxFile
,它们实现了基础 class public 方法(例如 createFile
、readFile
等)。然后在两个子 classes 中,我实现 public 方法以映射到特定于平台的方法(WINAPI 文件处理和 UNIX 文件处理)。
然后我会使用预处理器指令在主应用程序中有条件地加载 WinFile
或 LinuxFile
:
int main()
{
#if defined WIN32
WinFile fileSystem;
#elif defined LINUX
LinuxFile fileSystem;
#endif
// Both of above contain the same public method API.
std::string filedata;
filedata = fileSystem.readFile(...);
...
}
我的直觉告诉我这应该可行,但是有什么缺点吗?这会很容易成为可维护性问题吗?预处理器指令是否被视为 "hacks" 之类的?我知道它们与 header include guards 等一起使用,但它们是与编译器相关的逻辑,而不是与应用程序相关的逻辑。
还有其他方法可以实现我在这里尝试做的事情吗?
您可以在头文件中定义 API 并将实现移动到 cpp 文件中。 添加依赖于您的 os 的 .cpp 源文件(或通过 macros 保护 .cpp 文件,例如:
// File.h
class File
{
public:
void open(std::string);
};
// File_impl_win.cpp (compiled when win)
void File::open(std::string)
{
// impl
}
// File_impl_lin.cpp (compiled when linux)
void File::open(std::string)
{
// impl
}
优点是您不需要区分 LinuxFile 和 WindowsFile,您只需要一个 api。
但是已经有一个很棒的 crossplatform boost 文件系统使用库,boost filesystem,您可以使用它。