Linux环境高级编程--出错处理(CLStatus)

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

/*
 * 	CLStatus.h
 *
 *      Author: lilin
 *      email: 	[email protected]
 */
#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上APUEsrc/2/2.7/

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

/*
 * test.cpp
 *
 *      Author: lilin
 *      email: 	[email protected]
 */
#include <iostream>

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: 	[email protected]
 */
#include <iostream>

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();

(如有任何疑问或建议请联系[email protected])

时间: 2024-08-29 15:57:11

Linux环境高级编程--出错处理(CLStatus)的相关文章

Linux环境高级编程--介绍

从今天开始,将开启Linux环境高级编程(Advanced Programming Of Linux Enviroment)的学习笔记或者说总结,我将持续和大家分享自己的学习成果.本系列博客依托于lilin老师的课程,代码也基本上来自于课程的内容,在得到老师的同意和允许情况,我在github上新建了一个仓库和大家分享代码,仓库名称为APLE .有任何建议或者想法的可以一起参加进来改进代码. 首先,我们介绍下系列博客的基本内容,APLE系列主要是在掌握基本Linux API的基础上,封装了一套C+

Linux - Unix环境高级编程(第三版) 代码编译

Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebook.com/code3e.html 2. 安装依赖库:sudo apt-get install libbsd-dev  3. 进入下载目录make 4. 复制头文件和动态链接库 sudo cp ./include/apue.h /usr/include/ sudo cp ./lib/libapue

关于UNIX/Linux下安装《UNIX环境高级编程》源代码的问题

<UNIX环境高级编程(第三版)>是一本广为人知的unix系统编程书籍. 但是,书中的代码示例,要想正确的编译运行,要先做好准备工作: 1.下载源代码 传送门:http://apuebook.com/code3e.html 2.解压源代码 tar xf src.3e.tar.gz 3.安装libbsd-devel,不然编译的时候回报错 yum install libbsd-devel -y 4.编译 cd apue.3e/ make cp ./include/apue.h /usr/inclu

unix环境高级编程基础知识之第一篇

陆陆续续看完了圣经第一章,熟悉了unix的整个编程流程,c语言的用处在这里得到伸张. 从unix的体系结构,原来操作系统包括内核及一些其他软件,我们常常误称为linux内核为操作系统,这俨然成为一种共识.基本熟悉了shell的介绍,主流的是bash(Bourne-again shell),unix的文件的基本操作,出错处理,用户ID,信号(感觉类似windows的消息),时间值,最后还有系统调用和库函数的区别. 自己把这篇的所有代码用vim的敲完了,主要前期是熟悉unix的基本命令编程,大致了解

《UNIX环境高级编程(第3版)》

<UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison-Wesley Professional Computing Series) 原出版社: Addison-Wesley Professional 作者: (美)W. Richard Stevens    Stephen A. Rago 译者: 戚正伟 张亚英 尤晋元 出版社:人民邮电出版社 ISBN:9787

unix环境高级编程编译方法 -apue最简单编译方法(第二版)

<UNIX环境高级编程>(这里使用的是第二版本的源码)每个历程中,都会有这样一行源码: #include "apue.h" 这个头文件是作者把把每个例程中常用的标准头文件,一些常用的出错处理函数(err_**()之类的函 数)和一些常用的宏定义给整理在一个头文件中.这个可以省去在每个例程中录入较多的重复代码,这样可 以减少每个例程的长度.给读者带来了不少麻烦.下面给出一种源代码的编译方法. 1.解压文件到apue.2e目录 2.修改相应平台的文件,我使用的是linux,所以

UNIX环境高级编程(第三版)关于apue.h的用法

UNIX环境高级编程(第三版)中的例子用到apue.h这个头文件,但是书里面写的地址已经不能访问. 经过一番查找之后,找到如下解决方案: 1.到www.apuebook.com上下载第2版的源码,也可以直接点这里. 2.下载后的源码,需要修改一下: 1.Make.defines.linux中第6行WKDIR=/home/sar/apue.2e更改为目录的绝对路径. 2.apue.2e/ipp/ipp.h中第122行中的status换为Status.(也可换为其他,但要与下面对应) 3.apue.

Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录 (四) 一起学 Unix 环境高级编程 (APUE) 之 系统数据文件和信息 (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境 (六) 一起学 Unix 环境高级编程 (APU

UNIX环境高级编程笔记之文件I/O

一.看图说话 一图胜过千言,看图! 二.唠一唠 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书,也看过一些,但好像没有留下什么印象,今天再看,依然觉得像新的一样.很大的原因我想是一直以来都在用windows(用windows做开发为什么学不到真正的技术,我想大家都懂的),当然知识结构不完整,学习能力这些就不说了.所以,对于那些致力于想在Linux下做开发的人来说,