2

在 C++ 中,大多数开发人员使用pimpl idiomopaque 指针来隐藏公共 API 的私有数据/实现,例如:

  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. 每个人的优点和缺点是什么?
4

1 回答 1

2

你混淆了几件事:

  1. 第一个例子

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

      当您想与用户共享指针时,不透明类型特别有用,而不是它指向的详细信息或者阻止用户摆弄它,或者打破依赖关系)。

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

  2. 第二个例子

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

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

    2. 存储:丢失。你是不是也想来Node *m_impl这里?否则,这些示例不能直接比较,因为您无处Graph可保留 a Node,但是声明了类型。

于 2019-08-01T10:20:04.150 回答