我正在开发一个应该在Linux和Windows 7+上运行的C ++项目。这也是我几年前在一个非常简单和简短的基础课程之后使用C ++的第一周。
假设我需要访问文件系统,但由于操作系统有不同的API,我需要创建一个包装类来使事情保持一致。
以下工作如何:
拥有基类File
。从文件I继承WinFile
和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(...);
...
}
我的直觉说这应该有用,但有任何缺点吗?这会轻易成为可维护性问题吗?预处理器指令是否被视为“黑客”或其他什么?我知道它们与头文件一起使用包括警卫等,但它们是编译器相关的逻辑,而不是与应用程序相关的逻辑。
有什么其他方法可以实现我在这里要做的事情吗?
答案 0 :(得分:1)
您可以在头文件中定义API并将实现移动到cpp文件中。 添加依赖于您的os(或保护.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 filesystem,你可以使用它。