【问题标题】:pimpl desgin pattern , member functions need to be put in private classpimpl设计模式,成员函数需要放在私有类中
【发布时间】:2014-04-15 15:11:37
【问题描述】:

为了确保 ABI 具有 pimpl 模式,我们只需要将所有数据成员放入“私有类”是真的吗?我在一些关于pimpl的介绍中看到,他们还在“私有类”中实现了所有功能,并为“私有类”中的每个函数在导出的类上定义了一个“包装函数”,有必要吗?

【问题讨论】:

  • 我假设之前的 ABI 已经在使用 pimpl,所以你已经有了一个私有实现的指针。

标签: c++ design-patterns pimpl-idiom


【解决方案1】:

当您的目标是具有 ABI 兼容性时,您需要将所有数据成员变量放在私有类中。

this famous article about c++ ABI compatibility。从他们要做/不做的事情:

  • 您不能更改现有成员函数的签名。您可以添加新方法
  • 你不能在没有虚函数的类中添加虚函数
  • 您不能添加或更改非静态数据成员,或更改它们的顺序

清单还在继续,但这 3 项应该涵盖您的问题。

只要您 100% 确定您不会修改私有成员函数,就可以了。如果您期望改变,请将他们转移到私人课程。我总是期待改变。

【讨论】:

    【解决方案2】:

    包装函数的优点是可以在“私有”又名“实现”类中定义函数。 (虽然我总是使用结构体。由于整个事情是一个文件私有的,我看不出保护其实现的意义。)

    由于函数与数据定义在同一个类中,因此您无需像p->variable那样将p->粘贴在每个访问的前面。

    如果您将数据放入实现类/结构但没有函数,那么您的所有函数定义都需要在每次访问之前放入 p->

    【讨论】:

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