何时在C 中使用嵌套类上的PIMPL模式,反之亦然
When to use Pimpl pattern over Nested class in C++ or vice versa?
在C 中,大多数开发人员都使用 PIMPL IDIOM 或 opaque Pointers 从公共API中隐藏私人数据/实现,例如:
- => 第一种情况##不透明指针和Pimpl Idiom ##
//在标题文件中
class Node;
class Graph {
public:
A();
private:
Node* m_nodeImpl;
}
//类节点将在各自的CPP
中定义2。=>第二个情况##内部类/嵌套类方法##
//在标题文件中
class Graph {
public:
Graph(){};
private:
class Node
{
// implementation goes here
}
Node* m_nodeImpl;
}
问题是...
- 从班级设计的角度来看,这两个接近的实际区别(设计模式可能是(?
- 每个方面的优点和缺点是什么?
您正在混合几件事:
-
第一个示例
-
类型:不透明 - 这意味着该标头的用户可以看到类型 name ,但定义是隐藏的。
当您想与用户分享指针时,不透明类型特别有用,而不是指向 to 的细节(要么阻止用户摆弄它,要么打破依赖项(。 -
存储:pimpl。这只是意味着用户知道您(可能(在某处具有不透明类型的实例,他们知道您的顶级对象的大小包括该指针。
-
-
第二个示例
-
类型:嵌套 - 这避免污染封闭的名称空间(与第一个示例不同,程序中可以在同一名称空间中使用其他类型的
Node
(,但揭示了所有详细信息。请注意,您的嵌套类型也可以是向前宣布的,以控制可见性和名称空间污染。
-
存储:缺少。您的意思是在这里也有
Node *m_impl
吗?否则这些示例不是直接可比的,因为您的Graph
无处可保留Node
,但是声明了类型。
-
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么在保护模式下继承升级不起作用
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 此模式的C++RegEx
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 使用可变模板的Broadcaster/Listener模式
- c++方法参数只能在linux的发布模式下自行更改
- 资源管理设计模式
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- C++ 无法在字符数组中使用 for 循环打印字母模式
- Qt中的实现指针(PIMPL)
- 小字符串优化(调试与发布模式)
- 何时在C 中使用嵌套类上的PIMPL模式,反之亦然
- D 指针/pimpl 模式基类指针访问派生类成员
- 如何在PIMPL设计模式中调用参数化构造函数
- 如何在公共 API 接口类中将 auto getter&setter 与 PIMPL 设计模式相结合
- 如何在PIMPL模式下从嵌入类中访问父类方法
- 在遵循pimpl设计模式的类中实现move语义的正确方法是什么?