c++ - 何时在 C++ 中使用 Pimpl 模式而不是嵌套类,反之亦然?

标签 c++ inner-classes pimpl-idiom opaque-pointers

在 C++ 中,大多数开发人员都使用 pimpl idiom不透明指针 来向公共(public) API 隐藏私有(private)数据/实现,例如:

  1. => 第一种情况##不透明指针和PIMPL习惯用法 ##

//在头文件中

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

//类Node将在各自的cpp中定义

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

//在头文件中

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

问题是...

  1. 从类设计的角度来看,这两种方法之间的实际区别是什么(可能是设计模式)?
  2. 各自的优点和缺点是什么?

最佳答案

你混淆了几件事:

  1. 第一个示例

    1. 类型:不透明 - 这意味着类型名称对此 header 的用户可见,但定义是隐藏的。

      当您想要与用户共享指针,但不共享它所指向的内容的详细信息时,不透明类型特别有用(要么阻止用户摆弄它,要么打破依赖关系) )。

    2. 存储:pimpl。这仅意味着用户知道您(可能)在某处有一个不透明类型的实例,并且他们知道您的顶级对象的大小包括该指针。

  2. 第二个例子

    1. 类型:嵌套 - 这可以避免污染封闭的命名空间(因此程序中的同一命名空间中可以有其他类型的 Node ,与第一个示例不同),但会公开所有详细信息.

      请注意,您的嵌套类型也可以前向声明,以控制可见性和命名空间污染。

    2. 存储:丢失。您是否也想在这里拥有一个 Node *m_impl ?否则,这些示例无法直接比较,因为无论声明类型如何,Graph 都无法保存 Node

关于c++ - 何时在 C++ 中使用 Pimpl 模式而不是嵌套类,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57306593/

相关文章:

c++ - 奇怪的 std::vector::emplace() 编译错误

java - 内部枚举或类是否有效?

java - 内部类上的 Android 数据绑定(bind)不更新 TextView

c++ - 将 PIMPL 习惯用法与成员函数模板一起使用(事先不知道所有可能的数据类型)

c++ - pImpl 习语和可测试性

c++ - 将 pimpl 样式类定义编译并链接到库中 (C++)

c++ - '从 some_type** 到 const some_type** 的无效转换'

c++ - Qt VirtualKeyboard 启用和禁用键

c++ - 优化 Eigen 中的大型矩阵乘法

Java 内部类和 HashMap