何时在C 中使用嵌套类上的PIMPL模式,反之亦然

When to use Pimpl pattern over Nested class in C++ or vice versa?

本文关键字:PIMPL 模式 反之亦然 嵌套 何时      更新时间:2023-10-16

在C 中,大多数开发人员都使用 PIMPL IDIOM opaque Pointers 从公共API中隐藏私人数据/实现,例如:

  1. => 第一种情况##不透明指针和Pimpl Idiom ##

//在标题文件中

class Node; 
class Graph {  
 public:    
  A();  
 private:  
  Node* m_nodeImpl; 
}

//类节点将在各自的CPP

中定义

2。=>第二个情况##内部类/嵌套类方法##

//在标题文件中

class Graph {  
 public:    
  Graph(){};  
 private:  
  class Node
  {
    // implementation goes here
  }
  Node* m_nodeImpl;
}

问题是...

  1. 从班级设计的角度来看,这两个接近的实际区别(设计模式可能是(?
  2. 每个方面的优点和缺点是什么?

您正在混合几件事:

  1. 第一个示例

    1. 类型:不透明 - 这意味着该标头的用户可以看到类型 name ,但定义是隐藏的。

      当您想与用户分享指针时,不透明类型特别有用,而不是指向 to 的细节(要么阻止用户摆弄它,要么打破依赖项(。
    2. 存储:pimpl。这只是意味着用户知道您(可能(在某处具有不透明类型的实例,他们知道您的顶级对象的大小包括该指针。

  2. 第二个示例

    1. 类型:嵌套 - 这避免污染封闭的名称空间(与第一个示例不同,程序中可以在同一名称空间中使用其他类型的Node(,但揭示了所有详细信息。

      请注意,您的嵌套类型也可以是向前宣布的,以控制可见性和名称空间污染。

    2. 存储:缺少。您的意思是在这里也有Node *m_impl吗?否则这些示例不是直接可比的,因为您的Graph无处可保留Node,但是声明了类型。