我正在开发一个应该在Linux和Windows 7 +上运行的C ++项目。 这也是我在C ++第一周之后的一个非常简单而短暂的基础课程。
假设我需要访问文件系统,但由于操作系统具有不同的API,因此我需要创build一个包装类来保持一致。
以下工作:
有一个基类File
。 从文件我inheritanceWinFile
和LinuxFile
,实现基类公共方法(如createFile
, readFile
等)。 然后在这两个子类中,我实现了映射到特定于平台的方法(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(...); ... }
我的直觉说这应该起作用,但是有什么缺点吗? 这会容易成为可维护性问题吗? 预处理指令是否被认为是“黑客”? 我知道他们使用头包括守卫等,但他们是编译器相关的逻辑,而不是应用程序相关的逻辑。
任何其他方式来实现我在这里要做的事情?
您可以在头文件中定义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文件系统 ,你可以使用。