跨平台的C ++:在一个类的后面封装操作系统细节

我正在开发一个应该在Linux和Windows 7 +上运行的C ++项目。 这也是我在C ++第一周之后的一个非常简单而短暂的基础课程。

假设我需要访问文件系统,但由于操作系统具有不同的API,因此我需要创build一个包装类来保持一致。

以下工作:

有一个基类File 。 从文件我inheritanceWinFileLinuxFile ,实现基类公共方法(如createFilereadFile等)。 然后在这两个子类中,我实现了映射到特定于平台的方法(WINAPI文件处理和UNIX文件处理)的公共方法。

然后,我将使用预处理器指令在主应用程序中有条件地加载WinFileLinuxFile

 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(...); ... } 

我的直觉说这应该起作用,但是有什么缺点吗? 这会容易成为可维护性问题吗? 预处理指令是否被认为是“黑客”? 我知道他们使用头包括守卫等,但他们是编译器相关的逻辑,而不是应用程序相关的逻辑。

任何其他方式来实现我在这里要做的事情?

您可以在头文件中定义API,并将实现移到cpp文件中。 添加依赖于你的操作系统的.cpp源文件(或者通过.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。

但是,有一个令人惊叹的跨平台的文件系统升级库, boost文件系统 ,你可以使用。