PIMPL成语澄清
PIMPL idiom clarification
尝试从我决定使用的标头文件中删除所有实现详细信息时,然后尝试PIMPL IDIOM。大多数示例,例如cppreference,我已经看到使用间接水平,除了封装以外,我无法理解的原因。这些示例总是带有这种风味。
典型
//A.hpp
class A
{
public:
A(int);
//More non-static class methods
void set(int);
private:
struct a_impl;
std::unique_ptr<struct a_impl> pimpl;
};
//A.cpp
struct A::a_impl
{
private:
int i;
public:
a_impl(int i) : i{i}{}
//More non-static implementation class methods
void set(int i) {this->i = i;}
};
A::A(int i) : std::make_unique<struct a_impl>(i) {}
A::set(int i) {pimpl->set(i);} //????
A:://More indirect calls to non-static member functions through pointer
在某些方面,我开始想知道为什么我们要谈论实现,为什么需要所有这些复杂性和间接程度。为什么没有所有这些间接呼叫的情况下最简单的东西。
为什么不
//A.hpp
class A
{
public:
A(int);
//.....
void set(int);
private:
struct a_impl;
std::unique_ptr<struct a_impl> pimpl;
};
//A.cpp
struct A::a_impl
{
int i;
}
A::A(int i) : std::make_unique<struct a_impl>() { pimpl->i = i; }
A::set(int i) { pimpl->i = i; } //!!!!
我想澄清的:
1-所有这些样本仅出于教育和良好的封装实践而呈现?
2- 除了问题1? 3-或我推出的替代方案不是pimpl习惯吗?
您自己的方法,而与之比较的方法仅是习惯的两种不同风味。Herb Sutter在GOTW#100中列出了它们,等等:
班级应该进入IMPH对象?一些潜力 选项包括:
- 将所有私人数据(但不是功能)放入Impl;
- 将所有私人成员置于Impl;
- 将所有私人和受保护的成员置于Impl;
- 将所有私人非虚拟成员置于Impl;
- 将所有内容都放入sphand中,并将公共类本身写成仅作为公共接口,每个界面都作为简单的转发功能实现 (手柄/身体变体)。
每个人都有自己的强大和弱点。对于您学习的情况,您的方法似乎更好。对于其他情况,具有行为的PIMPL,而不仅仅是状态更合适。实际上没有一个尺寸适合所有尺寸。
相关文章:
- Qt中的实现指针(PIMPL)
- 如何在C++中最好地实施"newtype"成语?
- C++14 中unordered_map矢量和擦除删除成语的奇怪行为
- 为什么在PIMPL中无法访问实现类的常量函数?
- 当我不关心顺序并且没有重复项时,更快的擦除删除成语?
- 可以使用while(文件>>...C++成语在 Cython 中读取文件?
- 痘痘成语和交换
- C++从"NameBase"类到模板"Name"类的相互关系的成语(或模式)
- 范围TS成语和神秘的汽车&&
- 检测功能失败static_assert成语
- 擦除删除成语的性能增益从何而来
- 使用 PIMPL 惯用法,实现是否应始终是类的私有成员?
- C++详细介绍命名空间 vs 匿名 vs 私有方法到类 vs. pimpl vs. 朋友类
- 为什么擦除-删除成语不适用于反向迭代器
- C PIMPL成语,类模板和void模板参数
- PIMPL成语澄清
- 带有QT的Pimpl成语
- C4150:删除指向不完整类型和PIMPL成语的指针
- PIMPL 成语 VS 前向声明
- PIMPL 成语可访问性问题