【问题标题】:Cross-platform C++... platform-specific code sections in one file, or separate classes?跨平台 C++... 一个文件中的特定于平台的代码部分,还是单独的类?
【发布时间】:2012-04-23 16:36:26
【问题描述】:

编写有点低级的 C++ 内容,您经常需要编写特定于操作系统的内容。让我们以 MessageBox() 函数为例(不是一个出色的例子,因为框架会这样做,但很容易理解)。

假设您有一个基类App,每个项目都提供一个自定义子类,如MyApp。你可以有一个App::MessageBox() 方法,每个操作系统有几个#ifdef 块。或者,您可以有一个基类/接口,每个操作系统的子类提供实现。例如AppWin32 : public App

在某种程度上,后者对我来说似乎更整洁,但另一方面,这意味着您的 MyApp 必须使用一些丑陋的代码来确保它是正确的特定于操作系统的基类的子类。

有什么更好的方法?

【问题讨论】:

  • 必须使用一些丑陋的代码来确保它子类化了正确的操作系统特定的基类 嗯... ugly 代码实际上有一个名称:Factory 设计模式,我认为没有人会说它丑陋。
  • 工厂模式如何应用于从特定于操作系统的基类的子类化?
  • @John:工厂根据输入条件(操作系统等)创建正确的特定派生类。客户只需调用 Thingy::Create(args) 并 Create 处理确定要实例化和返回哪个派生类的所有细节。

标签: c++ architecture cross-platform


【解决方案1】:

由于文件/套接字/内存/数据库/...函数在不同平台之间的差异比 GUI 函数要小,因此大部分代码都是为所有架构共享/编译的。我只是在这些函数/类中的平台特定代码周围使用#ifdef 块。

对于完全不同的 GUI(或任何其他复杂的子系统)代码,您应该在平台目录下使用不同的实现(不是头文件,可能是内部头文件)文件。 (windows/window.cpp, xwin/window.cpp, macosx/window.cpp, ...)

看看这个方案的 GUI 工具包,wxwidgets 或 fltk 或其他大多数...

【讨论】:

    【解决方案2】:

    IMO,有些类太简单了,比如打开/关闭,#ifdef 对于这些情况还不错。我不认为为一个简单的功能提供一个抽象的平台层是一个好主意,它是过度设计的。

    但是跨平台很复杂。如果您想提供目标平台中不存在的特定平台功能,您应该创建一个抽象平台层并为每个平台实现它,例如Windows 中的剪贴板与 X11 中的 X 选择有很大不同,因此您必须维护不同的数据结构和算法以使其统一。

    【讨论】:

      【解决方案3】:

      如果将实现移动到多个 .cpp 文件,则只能使用一个 #ifdef 块。但是,如果需要,您也可以将其与第二种方法结合使用。不过,为了简单的使用,我想多个定义文件就可以了。

      【讨论】:

        【解决方案4】:

        #ifdef 绝对是最糟糕的。

        我会将特定于平台的代码放在单独的源代码树中(每个平台一棵树)。从项目位置(对于特定平台)可以使用 2 个文件系统链接 - 到“通用”树(例如,命名为“src”)和平台特定树(例如,命名为“特定”,实际上指向 linux、windows ,或其他特定于平台的源根目录)。 这可以保证您始终选择正确版本的学员。此外,您甚至可以为针对不同平台设计的类似类指定相同的名称。

        当然,这种方法在带有 FAT 文件系统的 Windows 下是不可能的,但现在这种情况已经很少见了(因为在 Windows 下通常没有理由不使用 NTFS)。

        【讨论】:

          猜你喜欢
          • 2020-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多