gpt4 book ai didi

c++ - C++ 中的跨平台 OOP

转载 作者:可可西里 更新时间:2023-11-01 15:34:27 24 4
gpt4 key购买 nike

当然,我知道最好的答案是“不要编写自己的跨平台代码,有人已经完成了你需要的”,但我这样做是作为一种业余爱好/学习练习,而不是任何付费容量。基本上,我正在用 C++ 编写一个小型控制台应用程序,我想让它跨平台,处理文件、套接字和线程等内容。 OOP 似乎是处理此问题的好方法,但我还没有真正找到一种好的模式来编写跨平台共享相同接口(interface)的类。

简单的方法是只规划一些元接口(interface),在程序的其余部分使用它,并根据平台用不同的文件编译同一个类,但我觉得必须有更好的方法那更优雅;至少,不会混淆 IntelliSense 及其同类产品的东西会很好。

我查看了 wxWidgets 源代码中的一些较小的类,它们使用了一种使用私有(private)成员为类保存数据的方法,例如

class Foo
{
public:
Foo();

void Bar();
private:
FooData data;
};

然后您可以通过根据平台选择不同的实现文件来编译它。这种方法对我来说似乎很笨拙。

我考虑过的另一种方法是编写接口(interface),并根据平台换出从该接口(interface)继承的类。像这样:

class Foo
{
public:
virtual ~Foo() {};
virtual void Bar() = 0;
};

class Win32Foo
{
public:
Win32Foo();
~Win32Foo();
void Bar();
};

当然,这种情况会搞砸实际的实例化,因为您不知道要为哪个实现创建对象,但这可以通过使用函数来解决

Foo* CreateFoo();

并根据您运行的平台改变函数的实现。我也不太喜欢这个,因为用一堆实例化方法乱扔代码似乎仍然很笨拙(而且这也与创建非跨平台对象的方法不一致)。

这两种方法哪种更好?有没有更好的办法?

编辑:澄清一下,我的问题不是“你如何编写跨平台 C++?”相反,它是“使用 C++ 中的类抽象出跨平台代码,同时尽可能多地保留类型系统的好处的最佳方法是什么?”

最佳答案

要真正实现需要操作系统支持的跨平台功能(如套接字),您将不得不编写在某些平台上无法编译的代码。这意味着您的面向对象设计将需要用预处理器指令进行补充。

但由于您无论如何都必须使用预处理器,所以是否需要像 win32socket(例如)继承自 socket 基类的东西是值得怀疑的或有用。当在运行时以多态方式选择不同的函数时,OO 通常很有用。但跨平台功能通常更像是一个编译时问题。 (例如,如果 win32socket::connect 函数甚至不能在 Linux 上编译,那么多态调用是没有用的!)因此,简单地创建一个 socket 类可能会更好根据使用预处理器指令的平台,其实现方式不同。

关于c++ - C++ 中的跨平台 OOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1884316/

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