在 C++ 中,大多数开发人员都使用 pimpl idiom 或 不透明指针 来向公共(public) API 隐藏私有(private)数据/实现,例如:
- => 第一种情况##不透明指针和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;
}
问题是...
- 从类设计的角度来看,这两种方法之间的实际区别是什么(可能是设计模式)?
- 各自的优点和缺点是什么?
最佳答案
你混淆了几件事:
第一个示例
类型:不透明 - 这意味着类型名称对此 header 的用户可见,但定义是隐藏的。
当您想要与用户共享指针,但不共享它所指向的内容的详细信息时,不透明类型特别有用(要么阻止用户摆弄它,要么打破依赖关系) )。
存储:pimpl。这仅意味着用户知道您(可能)在某处有一个不透明类型的实例,并且他们知道您的顶级对象的大小包括该指针。
第二个例子
类型:嵌套 - 这可以避免污染封闭的命名空间(因此程序中的同一命名空间中可以有其他类型的
Node
,与第一个示例不同),但会公开所有详细信息.请注意,您的嵌套类型也可以前向声明,以控制可见性和命名空间污染。
存储:丢失。您是否也想在这里拥有一个
Node *m_impl
?否则,这些示例无法直接比较,因为无论声明类型如何,Graph
都无法保存Node
。
关于c++ - 何时在 C++ 中使用 Pimpl 模式而不是嵌套类,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57306593/