用这种粉刺替代品能牺牲什么呢
what does one sacrifice with this pimpl alternative?
不幸的是,我经常使用Qt
(它声称有很多东西实际上并不是),而且由于Qt
广泛使用了粉刺习语,我也获得了很多关于粉刺模式的经验,并且知道我不喜欢它。我喜欢使用的另一种选择是:
// .hpp file
struct A
{
private:
struct B;
int a{};
};
// .cpp file
struct A::B
{
// replaces a private member function
static void f(A& a)
{
++a.a;
}
};
但是使用这种方法而不是使用私有函数成员或pimpl要牺牲什么呢?性能,二进制兼容性?对于粉刺,我们知道它是性能,因为增加了1级间接。
好吧,如果struct B
需要是一个类template
,接受任意类型参数,这将不起作用。
如果A::B
只包含静态方法/数据,那么在标题中完全没有必要公开它。您可以更简单地只在.cpp
文件中实现这些函数,而不必使它们成为类的一部分。
// .hpp file
struct A
{
};
// .cpp file
void f(A& a)
{
// some function
// Might be called from the implementation of methods of `A`
}
所以从一开始就没有理由使用嵌套类。
另一方面,如果确实有非静态数据/…在A::B
中,如果需要与A
的实例相关联(使用pimpl习惯用法的情况),那么您需要以某种方式将A::B
实例与A
的每个实例相关联。
一种直接的方法是在每个A
中保存一个指向A::B
的指针。这就是痘痘习语
pimpl的思想是将数据存储在A
的每个实例中,而不使该数据的内部结构成为A
的公共接口的一部分。
你的代码没有这样做,所以它不能替换pimpl。
简而言之,你的代码是隐藏辅助函数的一种方式,它是实现细节。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我应该使用什么来代替void作为变体中的替代类型之一
- 用这种粉刺替代品能牺牲什么呢