何时在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;
}
问题是。。。
你把几件事搞混了:
节点
),但会公开所有细节
请注意,嵌套类型也可以被前向声明,以控制可见性和命名空间污染节点*m_impl
?否则,这些示例就无法直接比较,因为您的图形
没有任何地方可以保留节点
,但是类型是声明的您可以将两者结合起来,只需声明
Graph::Node
类,并在源文件中定义,在第二个示例中,头文件的人类读者可以看到节点
类的详细信息。@Someprogrammerdude我认为这是pimpl/不透明\u ptr相对于嵌套类impl的主要优势,对吗?(甚至隐藏细节)通常这不是对人类“隐藏”的问题,而是依赖性问题。也就是说,如果节点
的实现(和声明)依赖于其他类,则需要将其包含在标头中。在PIML的情况下,你不需要这个。这对于API类来说是很重要的,不需要公开实现细节。@斯科洛特-是的,我忘了这一点,谢谢再次引起我的注意,是的,因此考虑到这两个因素,PIML首选权?那么,何时在C++中使用内部类呢?除了简单明了的描述,人类可读的东西外,完全忘了在第二个示例中添加Node impl ptr
,我明白了你的意思。