技术经验分享:C++程序设计的技巧

简介: 技术经验分享:C++程序设计的技巧

"

1.Pimpl概念

在进行项目开发中可能遇到的问题,程序编译耗时很长,每一次简单修改接口之后项目都会被完全重新编译,浪费了很多时间。这个机制是Private Implementation的缩写,顾明思议,将实现私有化,力图使得头文件对改变不透明.它的优点很多,诸如降低编译依赖、提高重编译速度之类的工具性优势、同时保持接口的稳定性。

2.Pimpl机制

Pimpl惯用法的基本思想是使用一个结构将原有接口class的私有数据成员和一些不希望被外界调用的对数据成员操作的过程封装起来,此时class的私用成员的结构看起来是:

private:

struct Member;

Member* data_member;

将这个Member的结构实现放在cpp文件中,类的私有成员中只能看到Member结构的前向声明以及一个该结构的指针。

这样就将一些我们不期望被用户调用的过程封装起来,可以防止资源泄露。同时类与数据成员之间的耦合最低,类看起来总是一个样子,包含该类声明的文件也不会因为类实现的改变而重新编译,节约了编译时间.

原有类:

1 class Person{

2 public:

3 Person(void);

4 ~Person();

5

6 private:

7 string name;

8 size_t age;

9 string from;

10 string work;

11 };

Pimpl惯用法修改后:

1 class Person{

2 public:

3 Person(void);

4 ~Person();

5 private:

6 struct Member;

7 Member* data_member;

8 }

Member相关实现在//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg1NDM2OA==.html

另一个cpp文件中,很明显,修改后Person类与数据成员的耦合度大大降低,用户对其他细节也变得不可见了。

例子:

在Pimpl机制中,我们使用前置声明一个impl类,并将这个类的一个指针实例放入主类中,如下:

//MyClass.h

class MyClassImpl; //forward declaration

class MyClass{

public:

MyClass();

~MyClass();

int foo();

private:

MyClassImpl * m_pImpl;

};

现在,除非我们修改MyClass的公有接口,否则这个头文件是不会被修改了。然后,我们用这个Impl类的实现来完成主类的细节实现,在主类的构造函数中,我们完成了实现类指针的实例化:

1 //MyClass.cpp

2 class MyClassImpl{

3 public:

4 int foo(){return bar();}

5

6 int bar(){return var++;}

7 int var;

8 };

9

10 MyClass::MyClass:m_Impl(new MyClassImpl){}

11 MyClass::~MyClass(){

12//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg1NzAwMA==.html

try{

13 delete m_pImpl;

14 }

15 catch(...){}

16 }

17

18 int MyClass::foo(){return m_pImpl->foo();}

Pimpl机制其实是桥接模式的一种变类。我们可以对实现类随意的进行增删和修改,而不会导致包含MyClass的源代码重新编译。当然,这样做的时间开销和空间开销也是有的。


"
image.png
相关文章
|
9天前
|
C++
C++ : 程序设计简单实例
C++ : 程序设计简单实例
14 3
|
9天前
|
安全 C++
C++:程序设计实例
C++:程序设计实例
14 2
|
17天前
|
C++
C++核心技术要点《友元函数,友元类》
C++核心技术要点《友元函数,友元类》
21 3
|
17天前
|
C++ 索引
C++核心技术要点《运算符重载》
C++核心技术要点《运算符重载》
23 2
|
17天前
|
C++
C++核心技术要点《异常处理详解》
C++核心技术要点《try-throw-catch异常处理详解》
18 2
|
1天前
|
存储 JavaScript 前端开发
程序与技术分享:C++程序设计实验考试准备资料(2019级秋学期)
程序与技术分享:C++程序设计实验考试准备资料(2019级秋学期)
|
1天前
|
SQL 人工智能 算法
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
|
1天前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
1天前
|
数据采集 自然语言处理 数据挖掘
一文搞懂:【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
一文搞懂:【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
|
2天前
|
C语言 C++
技术经验分享:c++中的数据类型转换
技术经验分享:c++中的数据类型转换