很多程序库对外提供若干类,每个方法出错时如何告知调用者是否出错,以及出错码(在Linux上在error.h中的全局errno就是保存我们Linux程序执行的出错码的)?方法很多,为了简化起见,函数将返回一个对象,该对象保存了函数的返回值和出错码。

/*

* CLStatus.h

*

* Author: lilin

* email: lilin@uestc.edu.cn

*/

#ifndef CLSTATUS_H

#define CLSTATUS_H

//用于保存函数的处理结果

class CLStatus

{

public:

/*

lReturnCode >=0表示成功,否则失败

*/

CLStatus(long lReturnCode, long lErrorCode);

CLStatus(const CLStatus& s);

virtual ~CLStatus();

public:

bool IsSuccess();

public:

/*通过这样可以是m_lErrorCode和m_lReturnCode做为public

成员隐藏了写,但可以公开了读*/

const long& m_clReturnCode;

const long& m_clErrorCode;

private:

//返回值

long m_lReturnCode;

//出错码

long m_lErrorCode;

};

#endif

#include "CLStatus.h"

CLStatus::CLStatus(long lReturnCode, long lErrorCode) : m_clReturnCode(m_lReturnCode), m_clErrorCode(m_lErrorCode)

{

m_lReturnCode = lReturnCode;

m_lErrorCode = lErrorCode;

}

CLStatus::~CLStatus()

{

}

CLStatus::CLStatus(const CLStatus& s) : m_clReturnCode(m_lReturnCode), m_clErrorCode(m_lErrorCode)

{

m_lReturnCode = s.m_lReturnCode;

m_lErrorCode = s.m_lErrorCode;

}

bool CLStatus::IsSuccess()

{

if(m_clReturnCode >= 0)

return true;

else

return false;

}

其中m_lReturnCode;存储返回值,m_lErrorCode存储错误码。const long& m_clReturnCode;const long& m_clErrorCode;通过这样可以是m_lErrorCode和m_lReturnCode做为public成员隐藏了写,但可以公开了读。当然我们还有其他选择,提getMIReturnCode()方法来达到同样的效果,当然在这里觉得通过提供get方法,而不提供set方法更符合面向对象的数据封装特性。(代码见github上

APUE

src/2/2.7/

上面的代码,是不是还可以效率上是不是还可以优化呢?

/*

* test.cpp

*

* Author: lilin

* email: lilin@uestc.edu.cn

*/

#include using namespace std;

class A

{

public:

A()

{

cout << "In A(): " << hex << (long)this << endl;

}

A(const A&)

{

cout << "In A(const A&): " << hex << (long)this << endl;

}

~A()

{

cout << "In ~A(): " << hex << (long)this << endl;

}

A& operator=(const A& a)

{

cout << "In operator=: " << hex << (long)this << " = " << hex << (long)(&a) << endl;

return *this;

}

};

A f()

{

A a;

return a;

}

int main(int argc, char* argv[])

{

A a;

a = f();

return 0;

}

代码运行结果如下:

In A(): 7fff834e277e

In A(): 7fff834e277f

In operator=: 7fff834e277e = 7fff834e277f

In ~A(): 7fff834e277f

In ~A(): 7fff834e277e

在把代码稍稍的修改下:

/*

* test.cpp

*

* Author: lilin

* email: lilin@uestc.edu.cn

*/

#include using namespace std;

class A

{

public:

A()

{

cout << "In A(): " << hex << (long)this << endl;

}

A(const A&)

{

cout << "In A(const A&): " << hex << (long)this << endl;

}

~A()

{

cout << "In ~A(): " << hex << (long)this << endl;

}

A& operator=(const A& a)

{

cout << "In operator=: " << hex << (long)this << " = " << hex << (long)(&a) << endl;

return *this;

}

};

A f()

{

return A();

}

int main(int argc, char* argv[])

{

A a = f();

return 0;

} 在看看运行结果:

In ~A(): 7ffff682a68f

In ~A(): 7ffff682a68e

明显整个过程少创建了一个对象,并且少调用了一次重载的=操作。效率是不是得到了明显的提升。但是为什么会这样呢?这里我们来看看程序到底做了些什么?

修改之后的代码我们实际上只创建了一个对象,是在f()函数中创建的。而在A a=f();这行代码中,调用并不是赋值运算,而是默认的拷贝构造函数,在默认的拷贝构造函数是将对象的引用直接返回过来,所以,也就只创建了一个CLStatus对象。至于为什么不是调用重载的赋值运算,而是调用了默认的拷贝构造函数,可以参考拷贝构造函数和赋值运算符区别

所以,为了兼顾效率和移植性,在今后我们函数的返回值都统一用CLStatus封装后在返回,并建议代码的书写方式如下:

CLStatus f()

{

return CLStatus(…);

}

CLStatus s = f();

(如有任何疑问或建议请联系cfreestar@163.com)

Linux环境高级编程系列博客 目录

Linux环境高级编程--介绍

Linux环境高级编程函数,Linux环境高级编程--出错处理(CLStatus)相关推荐

  1. linux内核的延时函数,linux中内核延时函数 (转)

    第一类延时函数原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsi ...

  2. linux协议栈skb操作函数,linux协议栈skb操作函数

    1,struct sk_buff数据结构 struct sk_buff{ //这两个结构必须放在最前面 struct sk_buff *next; struct sk_buff *prev; stru ...

  3. oracle的高级分组函数,group by 高级函数使用

    在使用group by常用的基本函数包括min,max,avg,sum,count等,除了基本函数oracle中提供了一些高级分组函数, Rollup,Cube,Grouping,Grouping s ...

  4. linux 内核 fget,fgets函数 linux中fgets函数怎么用

    一个函数该如何使用?我们最先要了解的就是这个函数的语法以及具体的含义是什么,所以今天我们就来看一看fgets函数在实际的运用过程当中是如何使用的,希望能给大家带来一定的帮助. fgets函数--lin ...

  5. linux动态库注册函数,Linux动态库函数的详解

    linux动态库函数的详解 加载动态库 void *dlopen(const char *filename, int flag); flag的可能值: rtld_lazy rtld_now rtld_ ...

  6. linux字符串编码转换函数,Linux C++ 字符串 编码识别、编码转换

    最近在做一个类似垂直下载的爬虫系统.下载之后有个解析模块,解析之后要求编码一致的向后传入索引,便遇到了编码转换问题. 1. 编码的识别 推荐使用 libchardet, 可以在这个页面下载,使用说明就 ...

  7. linux内核的外部接口函数,linux内核中GPIO的使用(二)--标准接口函数

    在linux内核中,有一些基本模块可以使用标准的接口函数来操作,比如GPIO.interrupt.clock,所谓的标准接口函数是指一些与硬件平台无关的.linux下做驱动通用的函数, 常用的有: g ...

  8. linux c 文件拷贝函数,Linux C函数库参考手册

    来自一本绝版的书,虽然没有函数 描述,但是最起码可以知道分类,就可以去 man 了 Linux C函数库参考手册 第1章字符测试 函数 isalnum(测试字符是否为英文字母或数字) isalpha( ...

  9. linux时间与日期函数,Linux时间日期函数

    最近跑实验的时候需要获取函数的执行时间,因此变在网上搜集整理了,在Linux下跟时间有关的函数,保存在此,以备不时之需- asctime(将时间和日期以字符串格式表示) 相关函数 time,ctime ...

最新文章

  1. webpack 中的加载器简介||webpack 中加载器的基本使用——1. 打包处理 css 文件 2. 打包处理 less 文件 3.打包处理 scss 文件
  2. mysql 乐观锁 version_乐观锁-version的使用
  3. [图论]强联通分量+缩点 Summer Holiday
  4. Keras.layers各种层介绍,网络层、卷积层、池化层 等
  5. Java注解参数类型枚举值_EffectiveJava-5-枚举和注解
  6. Linux进程全解5——父子进程对文件的操作
  7. linux脚本vrrp_script,keepalived 的 vrrp_script
  8. VC++ .net 2005运行库解析
  9. 转载-C#委托之多播委托( 二)
  10. (44)FPGA面试技能提升篇(VCS仿真工具)
  11. 教育|一位女博士五年的艰难毕业历程
  12. gvim配置文件参考
  13. mac软件下载常用经典网站
  14. PS学习笔记一:跟着李涛学PS第一讲——光和色的关系
  15. 微信强制性诱导分享php,微信公众号运营者注意了,下面这些诱导分享到朋友圈都是不可以的...
  16. IBC和电信管理论坛将在数字转型世界峰会上进行媒体-电信融合项目演示
  17. Python版打字练习软件源代码,键盘练习软件源代码,含娱乐模式和训练模式
  18. [体感游戏]关于体感游戏的一些思考(二) --- POV和基本场景
  19. Android ObjectAnimator类:手把手带你自定义属性动画
  20. 亚信实习——初来乍到

热门文章

  1. 一文看尽深度学习中的20种卷积(附源码整理和论文解读)
  2. 一种实时轻量级3D人脸对齐方法
  3. 综述|深度学习在SLAM定位与建图中的应用(近250篇参考文献)
  4. 最新!2021中国内地大学ESI排名出炉:326所高校上榜!
  5. CenterFusion: 基于Radar和Camera融合的3D检测算法
  6. 盘点类别级物体6D位姿估计
  7. 2021-10-14 yolov5踩坑!!!经验大赏
  8. 温度对结构光深度的影响
  9. Chemistry.AI | 基于非线性激活的多层感知器预测分子特性
  10. Chemical Science | 基于金属的片段分子库用于筛选候选药物