何时在C+;中的嵌套类上使用Pimpl模式+;反之亦然? 在C++中,大多数开发人员使用了 pIMPL习惯用法>强> >不透明指针< /强>,以隐藏来自公共API的私有数据/实现,例如: =>第一种情况##不透明指针和PIMPL习惯用法##

何时在C+;中的嵌套类上使用Pimpl模式+;反之亦然? 在C++中,大多数开发人员使用了 pIMPL习惯用法>强> >不透明指针< /强>,以隐藏来自公共API的私有数据/实现,例如: =>第一种情况##不透明指针和PIMPL习惯用法##,c++,inner-classes,pimpl-idiom,opaque-pointers,C++,Inner Classes,Pimpl Idiom,Opaque Pointers,//在头文件中 class Node; class Graph { public: A(); private: Node* m_nodeImpl; } class Graph { public: Graph(){}; private: class Node { // implementation goes here } Node* m_nodeImpl; } //类节点将在各自的cpp中定义 2.=>第二

//在头文件中

class Node; 
class Graph {  
 public:    
  A();  
 private:  
  Node* m_nodeImpl; 
}
class Graph {  
 public:    
  Graph(){};  
 private:  
  class Node
  {
    // implementation goes here
  }
  Node* m_nodeImpl;
}
//类节点将在各自的cpp中定义

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

//在头文件中

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

问题是。。。
  • 从类设计的角度来看,这两种方法之间的实际区别是什么(设计模式可能是不同的)
  • 它们各自的优点和缺点是什么

  • 你把几件事搞混了:

  • 第一个例子

  • 类型:不透明-这意味着类型名称对此标头的用户可见,但定义是隐藏的

    当您希望与用户共享指针,但不希望与用户共享指针指向的细节时,不透明类型尤其有用(以阻止用户摆弄指针,或打破依赖关系)

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

  • 第二个例子

  • Type:nested-这可以避免污染封闭的名称空间(因此与第一个示例不同,在程序的同一名称空间中可以有其他类型的
    节点
    ),但会公开所有细节

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

  • 存储:丢失。你的意思是在这里也有一个
    节点*m_impl
    ?否则,这些示例就无法直接比较,因为您的
    图形
    没有任何地方可以保留
    节点
    ,但是类型是声明的


  • 您可以将两者结合起来,只需声明
    Graph::Node
    类,并在源文件中定义,在第二个示例中,头文件的人类读者可以看到
    节点
    类的详细信息。@Someprogrammerdude我认为这是pimpl/不透明\u ptr相对于嵌套类impl的主要优势,对吗?(甚至隐藏细节)通常这不是对人类“隐藏”的问题,而是依赖性问题。也就是说,如果
    节点
    的实现(和声明)依赖于其他类,则需要将其包含在标头中。在PIML的情况下,你不需要这个。这对于API类来说是很重要的,不需要公开实现细节。@斯科洛特-是的,我忘了这一点,谢谢再次引起我的注意,是的,因此考虑到这两个因素,PIML首选权?那么,何时在C++中使用内部类呢?除了简单明了的描述,人类可读的东西外,
    完全忘了在第二个示例中添加Node impl ptr
    ,我明白了你的意思。