代理类/句柄与子类

时间:2013-01-23 04:27:57

标签: c++

  

可能重复:
  Pimpl idiom vs Pure virtual class interface

在隐藏实现时,我已经阅读了很多关于“代理类”或“处理类”或“cheshire cat smile”技术的内容,其中您基本上将指向“真实”类的指针作为公共数据成员/ proxy类,然后在“真正的”类中实现所有内容。

但我正在查看一些示例代码,并注意到另一种似乎更容易的技术,因为它不需要您在句柄类中编写“虚拟”方法,然后调用句柄类中的实际方法,根本不需要任何数据成员,整体看起来更加精简。

该技术只是将您的所有公共方法定义为struct(或所有内容为public的类)和所有virtual=0成员函数。因此没有实施。然后,定义一个静态函数,该函数返回指向此struct的指针,以便客户端可以使用该类。但是在幕后,这个方法实际上返回了struct的子类,然后你可以在这个子类中继续进行更多的操作。

如果这是如此简单,我认为比包含数据成员的公共类更优雅,该数据成员是指向单独类的指针,并且必须实现公共类对数据成员方法的调用,那么为什么不是'这是隐藏实现中讨论最多的技术吗?

1 个答案:

答案 0 :(得分:0)

正如this article所述:

大多数人推荐PIMPL方法的原因是它有一些明显的优势:

  • 不需要工厂功能,可以使用new(),delete()或 在堆栈上创建对象。
  • 您可以轻松地进行子类化。
  • 接口方法不是虚拟的,因此可以调用它们 快点。 (另一方面,我们需要额外的内存提取才能到达 实现对象。)
  • 可以在现有类中引入PIMPL而不更改它 外部接口或其与其他类的关系。

抽象类方法有自己的一些优点:

  • 更清洁的代码和更少的打字,因为我们不必写 转发公共接口中方法的存根。
  • 多个类可以实现相同的接口。我们可以静态地 或动态选择我们想要使用的特定实现, 这为我们提供了更大的灵活性。