《高质量程序设计指南——C++/C》第三版勘误

1.Page IX:1.5 “关于软件开发。。。”存在印刷问题;

2.Page 7:倒数第13行,“啰里啰唆”印刷有问题;

3.Page 15: 表1-2有些许印刷问题;

4.Page 58: 示例4-6,代码用下列代码替换:

class Base

{

private:

int m_a;

int m_b;

// 示例

Derived objD1;

Base objB1 = objD1;      // 见图4-3左图

Derived *pD1 = &objD1;

};

class Derived : public Base

{

int m_c

};

Base *pB1 = pD1;       // 见图4-3右图

5.Page 81:示例4-20中的注释/*第三条。。。*/修改为/*第二条。。。*/;

6.Page 83:在“最后我们举一个数值计算。。。。”一行前面插入“5数值计算。”;

7.Page 96: 示例6-1:将“T是形参”修改为“_T是形参”;

8.Page 181:[建议10-5]中,把“/t”修改为‘/t’;

9.Page 193: 示例12-3中少写了一句话,所以用下面的代码替换(红色表示修改的地方):

typedef  unsigned char  BYTE;

template<unsigned int N  /*容量(字节数)*/>

class RingBuffer {

public:

typedef size_t                       size_type;

typedef GenericLocker<CriticalSection>  _BufferLocker;

RingBuffer() : m_pushPos(0), m_popPos(0), m_count(0) {

assert(N > 0);

m_pRingBuffer = new BYTE[N];

}

~RingBuffer() { delete []m_pRingBuffer; }

bool is_full() const {

_BufferLocker guard(m_mutex);

return (m_count == N);

}

bool is_empty() const {

_BufferLocker guard(m_mutex);

return (m_count == 0);

}

size_type size() const {

_BufferLocker guard(m_mutex);

return m_count;

}

size_type capacity() const { return N; }

size_type push(const BYTE *data, size_type length) {

_BufferLocker guard(m_mutex);

assert(data != NULL);

if (length == 0 || length > (N - m_count))

return 0;

size_type rearLen = N - m_pushPos;              // 尾部剩余空间

if (length <= rearLen) {

::memmove(&m_pRingBuffer[m_pushPos], data, length);

m_pushPos += length;

m_pushPos %= N;                          // 调整新的push位置

}else{

::memmove(&m_pRingBuffer[m_pushPos], data, rearLen);

::memmove(m_pRingBuffer, data + rearLen, length - rearLen);

m_pushPos = length - rearLen;                // 调整新的push位置

}

m_count += length;

return (length);

}

size_type pop(BYTE *buf, size_type length) {

_BufferLocker guard(m_mutex);

assert(buf != NULL);

if (length == 0 || length > m_count)

return 0;

size_type rearLen = N - m_popPos;                // 尾部剩余数据

if (length <= rearLen) {

::memmove(buf, &m_pRingBuffer[m_popPos], length);

m_popPos += length;

m_popPos %= N;                             // 调整新的pop位置

}else {

::memmove(buf, &m_pRingBuffer[m_popPos], rearLen);

::memmove(buf + rearLen, m_pRingBuffer, length - rearLen);

m_popPos = length - rearLen;                  // 调整新的pop位置

}

m_count -= length;

return (length);

}

void clear() {

_BufferLocker guard(m_mutex);

m_pushPos = 0, m_popPos  = 0, m_count = 0;

}

private:

RingBuffer(const RingBuffer<N>&);

void operator=(const RingBuffer<N>&);

private:

BYTE          *m_pRingBuffer; // buffer

size_type         m_pushPos;               // 新的push位置:pushPos=(popPos+count)% N

size_type          m_popPos;             // 新的pop位置

size_type         m_count;               // 有效字节数

CriticalSection    m_mutex;

};

10.          Page 275:把[建议15-1]中的“比如反跟踪”修改为“(比如反跟踪)”;

11.          Page 309: 把“…必须派生自类似于接口IUnknown类”修改为“…必须派生自类似于接口IUnknown的类”;

12.          Page 343:示例17-7存在一个小问题,现用下面的代码替换(红色是修改过的地方):

template<typename T  /*元素类型*/ , unsigned int N /*容量*/ >

class CyclicQueue {

public:

typedef T                    value_type;

typedef size_t                 size_type;

typedef T&                   reference;

typedef const T&              const_reference;

CyclicQueue() : m_popPos(0), m_count(0) {

assert(N > 0);

m_beginPtr = (T*)(::operator new(sizeof(T) * N));  // 分配原始空间

}

~CyclicQueue() {

_Clear();                                              // this->_Clear();

::operator delete((void*)m_beginPtr);

}

CyclicQueue(const CyclicQueue<T, N>& copy) : m_popPos(0), m_count(0) {

assert(N > 0);

m_beginPtr = (T*)(::operator new(sizeof(T) * N));            // 分配原始空间

size_t copyPos = copy.m_popPos;

for (size_type idx = 0; idx < copy.m_count; ++idx) {

_Copy(idx, copy.m_beginPtr[copyPos]);        // this->_Copy();

++copyPos; copyPos %= N; ++m_count;

}

}

CyclicQueue& operator=(const CyclicQueue<T, N>& other) {

CyclicQueue<T, N> temp(other);                                     // 调用拷贝构造函数

_Swap(temp);                                   //  this->_Swap();

return (*this);

}

bool is_empty() const { return (m_count == 0); }

bool is_full() const { return (m_count == N); }

value_type front() {

assert(m_count != 0);

return (m_beginPtr[m_popPos]);

}

value_type front() const {

assert(m_count != 0);

return (m_beginPtr[m_popPos]);

}

value_type back() {

return _Back();                                  // this->_Back();

}

value_type back() const {

return _Back();                                  // this->_Back();

}

bool push(const_reference data = T()) {

if (m_count < N) {                                                          // 不满!

size_type pushPos = (m_popPos + m_count) % N;

_Copy(pushPos, data);                                      // this->_Copy();

++m_count;

return true;

}

return false;

}

bool pop(reference data) {

if (m_count > 0) {                                                           // 不空!

data = m_beginPtr[m_popPos];                       // operator=

_Destroy(m_popPos);                               // this->_Destroy();

--m_count; ++m_popPos; m_popPos %= N;     // 新的pop位置

return true;

}

return false;

}

size_type size() const { return m_count; }

size_type capacity() const { return N; }

void clear() { _Clear(); }                                     // this->_Clear();

void swap(CyclicQueue<T, N>& other) {

_Swap(other);                                   // this->_Swap();

}

private:

void _Clear() {

for (; m_count > 0; --m_count) {

_Destroy(m_popPos);                                         // this->_Destroy();

++m_popPos; m_popPos %= N;

}

m_popPos = 0;

}

void _Destroy(size_type idx) {

assert(idx < N);

T *pTemp = (m_beginPtr + idx);

pTemp->~T();                                      // 调用析构函数销毁元素对象

}

void _Copy(size_type idx, const_reference data) {

assert(idx < N);

T *pTemp = (m_beginPtr + idx);

new ((void*)pTemp) T(data);  // 调用placement new和拷贝构造函数复制对象

}

void _Swap(CyclicQueue<T, N>& other) {

std::swap(m_beginPtr, other.m_beginPtr);

std::swap(m_popPos, other.m_popPos);

std::swap(m_count, other.m_count);

}

value_type _Back() const {

assert(m_count != 0);

size_type pushPos = (m_popPos + m_count) % N;

if (pushPos == 0)

return (*(m_beginPtr + N - 1));

return (m_beginPtr[pushPos - 1]);

}

value_type        *m_beginPtr;     // 队列存储空间起始位置

size_type          m_popPos;        // 下次pop位置

size_type          m_count;          // 有效元素个数

};

13.          Page 348:将“顾名思义”这一段第二行的“输出功能”改为“输入/输出功能”;

14.          Page 357:图17-12用图替换:

韩永泉

2007-6-18

《高质量程序设计指南——C++/C》第三版勘误相关推荐

  1. C语言书籍阅读-读书笔记--高质量程序设计指南》--C/C++,林锐

    最近闲下来想找机会参加一些编程比赛锻炼锻炼,可没有一个相关网站可以搜集这些信息,因而自己记录下来: 百度之星,http://star.baidu.com/index/developer.时间07.25 ...

  2. 高质量程序设计指南C/C++阅读笔记

    阅读书籍:<高质量程序设计指南C/C++语言>林锐.韩勇泉著 说明: 本文档为阅读笔记,要求有一定的C/C++基础,属于提高篇 一.软件质量基本概念 功能属性: 1.正确性Correcte ...

  3. 【转贴】对《高质量程序设计指南--C++/C第二版》的探讨

    <高质量程序设计指南--C++/C(第二版)>的读书心得              作者:fang_rk     写这篇文章是出于一个偶尔的原因:读计算机系的女友即将升入研究生三年级,她说 ...

  4. 高质量程序设计指南:C++/C语言

    <高质量程序设计指南:C++/C语言> 基本信息 作者: 林锐 韩永泉 [作译者介绍] 出版社:电子工业出版社 ISBN:9787121186172 上架时间:2012-10-24 出版日 ...

  5. 《高质量程序设计指南——C/C++语言》之开篇记

    <高质量程序设计指南--C/C++语言>是林锐博士和韩永泉先生撰写的著作,记得刚毕业那会读过了.应该说,这本书是对学校教科书的一个很好补充和提高.关于C/C++的经典书籍,国外已经有很多很 ...

  6. 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道

    第1章 高质量软件开发之道 本书的第1章之高质量软件开发之道,作者用大量的篇幅介绍了"软件质量"的基本概念,解释了软件质量的十大属性.这十大质量属性又分为功能性和非功能性两类,功能 ...

  7. 高质量程序设计指南附录试题

    附录B :C++/C试题 本试题仅用于考查C++/C程序员的基本编程技能.内容限于C++/C常用语法,不涉及数据结构.算法以及深奥的语法.考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不 ...

  8. C++ 高质量程序设计指南读书笔记

    第四章 入门 1,全局变量的初始化不要依赖另一个全局变量.因为无法判断顺序. 2,每一个源代码文件就是一个最小的编译单元,每一个编译单元都能独立编译而不需要知道其他编译单元的存在及其编译结果.好处:公 ...

  9. 高质量程序设计指南c++/c语言(33)--函数指针

    函数类型由其返回类型和形参表确定,而与函数名无关. // pf points to function returning bool that takes two const string refere ...

最新文章

  1. 做专才能做强做大——从OA、协同之争说起
  2. 字节跳动内部学习资料泄露!mysql的安装与配置
  3. java instanceof用法_Java基础高频面试题汇总(1.4W字详细解析)
  4. 23种设计模式C++源码与UML实现--简单工厂模式
  5. 4种趋势将在2021-2021年改变您的数据和分析策略
  6. 职业规划要结合用人单位需求。
  7. 腾讯技术工程沙龙深圳站来了,我们一起聊聊“工业互联网”
  8. 软件工程专业(互联网应用开发与优化方向)软件工程实践二环节教学大纲
  9. Linux多线程——使用互斥量同步线程
  10. ICCV2021 人脸深伪分析挑战赛 重磅来袭
  11. 人生需要积极勇敢的去面对
  12. 全民小视频 无水印下载教程 (三步完成)
  13. 信息化案例:国家电投
  14. javplayer 使用教程_Revit形状编辑操作大全(文末附39套BIM软件自学教程)
  15. 第一性原理分子动力学(AIMD)结果分析教程
  16. list集合练习----斗地主
  17. 最佳量化交易的计算机操作系统
  18. UVM基础-Sequence、Sequencer(二)
  19. 计算机启动时滴滴两声,电脑开机时出现滴滴两声后,不能开机,怎么回事。
  20. 家庭备忘记事便签软件哪个实用?

热门文章

  1. 我的世界服务器显示文字,我的世界服务器悬浮字体教程 | 手游网游页游攻略大全...
  2. win10 运行debug程序
  3. 一个简单的方法修复ubuntu引导损坏
  4. 有趣的跳跃(循环判断)
  5. 中望3D 2021 自动标注
  6. `LINK : fatal error LNK1104: 无法打开文件“***.dll”`的问题解决
  7. sap LICENSE KEY和 ACCESS KEY 破解
  8. 高手勿进!写给初中级程序员以及还在大学修炼的“准程序员”的成长秘籍
  9. 技术资源:国内知名技术网站网址
  10. B. Integers Have Friends(cf)二分 + st表