- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发一个应该在 Linux 和 Windows 7+ 上运行的 C++ 项目。这也是我在几年前参加了一个非常简单和简短的基础类(class)之后使用 C++ 的第一周。
假设我需要访问文件系统,但由于操作系统有不同的 API,我需要创建一个包装类来使事情保持一致。
以下是否可行:
有一个基类 File
。我从文件继承 WinFile
和 LinuxFile
,它们实现了基类公共(public)方法(例如 createFile
、readFile
等.).然后在两个子类中,我实现了公共(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 文件中。添加依赖于您的操作系统的 .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 ,您可以使用它。
关于c++ - 跨平台C++ : wrapping OS-specifics behind a class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32463192/
我是一名优秀的程序员,十分优秀!