技术经验分享: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
相关文章
|
3月前
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
61 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
|
6月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
4月前
|
人工智能 Anolis
聚焦C++20 最新标准!技术 Workshop 精彩亮点一览 | 2024 龙蜥大会
多场技术 Workshop、多位领域专家亲自授课,分享独家洞察与宝贵经验。
|
4月前
|
算法 C# 开发工具
《黑神话:悟空》背后的编程语言揭秘——超越C++的多元技术融合
【8月更文挑战第27天】在游戏开发领域,一款游戏的成功往往离不开其背后强大的技术支持和编程语言的精妙运用。《黑神话:悟空》作为备受瞩目的国产单机动作游戏,其开发过程不仅涉及了多种编程语言,更是一次技术创新的集中展现。然而,当我们深入探讨其开发语言时,会发现它并非仅依赖于单一的C++,而是融合了多种编程语言的优势,共同铸就了这款游戏的辉煌。
291 0
|
6月前
|
C++
C++ : 程序设计简单实例
C++ : 程序设计简单实例
48 3
|
6月前
|
安全 C++
C++:程序设计实例
C++:程序设计实例
56 2
|
6月前
|
存储 JavaScript 前端开发
程序与技术分享:C++程序设计实验考试准备资料(2019级秋学期)
程序与技术分享:C++程序设计实验考试准备资料(2019级秋学期)
|
6月前
|
SQL 人工智能 算法
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
技术心得记录:模板函数函数模板FunctionTemplate(C++Primer
|
6月前
|
数据采集 自然语言处理 数据挖掘
一文搞懂:【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
一文搞懂:【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
169 0
|
6月前
|
C语言 C++
技术经验分享:c++中的数据类型转换
技术经验分享:c++中的数据类型转换
32 0