c++ - Pimpl 带有包含类的 header

标签 c++ design-patterns pimpl-idiom

我遇到了一个将 pimpl 类作为 header 的实现,并将其包含在 pimpl 实现中。它甚至有意义吗?像这样:

用户界面.h

class UI {

public:

   UI();
   virtual ~UI();

   // bunch of methods
private:

      UIImpl* m_impl;
}

UIImpl.h

class UIImpl
{

public:

  UIImpl( ...) ;
  ......
}

UIImpl.cpp

#include "UIImpl.h" 

UIImpl::UIImpl()

{

  //Actual Implementation
  ...

}

我在想 PIMPL 的原因是将实现完全隐藏在 cpp 文件中。使用 header 是否会破坏目的?

最佳答案

它们是不同类型的 header 。 UI.h 是“公共(public)的”——它是库外部接口(interface)的一部分,供其客户端使用。

UIImpl.h 是“私有(private)的”,就像 UIImpl.cpp 一样。只要它从未包含在公共(public) header 中,它就可以保持对客户端不可见,就像 .cpp 本身一样。

impl 类定义拆分到头文件中可能有多种原因。或许还有一些其他的实现类被传递了UIImpl&参数。也许只在标题上运行 doxygen 更容易。也许这只是项目政策。

底线是,它仍然是 Pimpl,只要您不发布私有(private) header 。

关于c++ - Pimpl 带有包含类的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18573944/

相关文章:

C# 设计模式 - 为多数据源设计的最佳方式

java - 我应该使用哪种设计模式来按积分设置比赛 field ?

c++ - 如何避免在这个特定的类层次结构设计中向下转型?

c++ - 可变参数模板索引包扩展

c++ - 使用 boost::spirit 在解析为结构时将解析值默认为较早的值

c# - 服务定位器模式和 DDD

c++ - PIMPL 类的 setter 应该是 const 成员函数吗?

c++ - std::stoi 的基本参数

C++计算行主和列主访问时间

c++ - Pimpl with smart ptr - 为什么需要构造函数/析构函数