gpt4 book ai didi

c++ - 跨平台C++ : wrapping OS-specifics behind a class

转载 作者:可可西里 更新时间:2023-11-01 10:34:57 25 4
gpt4 key购买 nike

我正在开发一个应该在 Linux 和 Windows 7+ 上运行的 C++ 项目。这也是我在几年前参加了一个非常简单和简短的基础类(class)之后使用 C++ 的第一周。

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

以下是否可行:

有一个基类 File。我从文件继承 WinFileLinuxFile,它们实现了基类公共(public)方法(例如 createFilereadFile 等.).然后在两个子类中,我实现了公共(public)方法以映射到特定于平台的方法(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(...);

...
}

我的直觉告诉我这应该可行,但是有什么缺点吗?这会很容易成为可维护性问题吗?预处理器指令是否被视为“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com