当前位置: 首页 > 工具软件 > Pimp3 > 使用案例 >

C++ pimp技巧

彭阳朔
2023-12-01

概念

这个技巧可以降低编译依赖

pimp实现
A.h
#ifndef A_H // 一定要加这个否则重复展开导致错误
#define A_H
#include "B.h" 
class ID::IDPimp{  // 类内声明,类外定义,防止直接访问实现细节
   public:
   void print()
   {
      cout << "真正的实现" <<endl;
   }
}
#endif

B.h
#ifndef B_H 
#include "A.h" 
class ID {
 public:
 void print()
 {
      pimp -> print();
 }
 ID()
 {
     pimp = new IDPimp();
 }
 ~ ID()
 {
     delete pimp;
 }  
 private:
 class IDPimp;  // 声明
 IDPimp pimp;
}
#endif 

非Pimp实现

A.H
#ifndef A_H
#define A_H
class ID{
 public:
 void print()
 {
    cout << "AAAA"<<endl;
 }
 // int _a;
};
#endif
#ifndef B_H
#define B_H
class PeoPleID:public ID{
public:
void print()
 {
     ID::print();
 }
 }

总结

这样设计就可以减少编译依赖。试想如果ID类的内部实现没有跟ID分离开来,如果有个类继承或者使用了ID类,使用到ID类的这个头文件也需要重新编译。(如B.h)
如果我们使用Pimp 方法,首先使用到ID类的肯定不用编译,ID类也不用编译,只要编译IDPimp类就行,然后跟它们重新链接。

优点
  1. 减少编译依赖
  2. 实现隐藏
  3. 降低耦合度
缺点
  1. 之前直接调用对应的函数即可,现在通过指针调用增加运行时开销
  2. 多了一个指针变量,因为如果不以Pimp的方式,可以不多定义一个指针,增加空间开销
  3. 生命周期析构/构造的时候增加运行开销,之前直接调用构造函数即可,现在又需要在构造函数里面通过new/delete完成构造和析构,new/delete又转调了operator new/delete 增加运行开销
 类似资料: