加载中...
从零开始,实现日志流
第1节:“流”的基本概念与应用
第2节:C++和C标准输入输出同步
第3节:C++和C的格式化输入输出
第4节:重温文件流和字符串流
第5节:为自定义类型重载流操作
第6节:三大关联知识点综合强化复习
第7节:从零开始,实现日志流
第8节:“我的日志流”终版
课文封面

从需求到实现,完整参与一套可实用的日志系统的开发。建议在校生将本项目用作面试实践项目之一。

  1. 从目标开始分析;
  2. 详细讲解思路,了解一个“类”如何从零到一;
  3. 仅依赖C++标准库……
  4. 涉及“模板方法”、“操作符重载”、“内存流 + 文件流” 的综合应用

简述

程序的运行日志,通常只给开发人员和运维人员——也就软件开发公司内部——查看,而不是给最终用户查看。

举个极端的例子,假设我们有一个软件系统,可以让用户(已经完成注册)输入希望自己在本系统中的称呼。然后,老有个别用户在这个环节,输入 “爸爸”。

这个太令人生气了!

原有的功能代码示例如下:

std::string InputTitle(std::string const& name) { std::cout << "亲爱的 " << name << ",你希望大家都怎么称呼你呀?"; std::string title; std::getline(std::cin, title); std::cout << "好的,亲爱的 " << name << ",以后我们大家就叫你:" << title << "了。" << std::endl; return title; }

现在,我们为这个函数加入日志功能,记录所有人设置成尊称,并且,针对“爸爸”或“爷爷”这种气人的昵称,特别 记录下来:

std::string InputTitle(std::string const& name) { std::cout << "亲爱的 " << name << ",你希望大家都怎么称呼你呀?"; std::string title; std::getline(std::cin, title); ///// 记录日志开始 ///// std::cout << name << "->" << title; if (name == "爸爸" || name == "爷爷") { std::cerr << "抓到一个坏家伙:" << name << std::endl; } ///// 记录日志结束 ///// std::cout << "好的,亲爱的 " << name << ",以后我们大家就叫你:" << title << "了。" << std::endl; return title; }

这样的代码有许多不好之处:

  • 仅用于内部的日志输出,和具体的业务输出内容,混在一起;
  • 日志没有记录到单独文件中去,程序一退出就丢了,不利于使用;
  • 直接 cout 等语言内置的输出流对象,很难从代码一眼识别出哪里是日志。

我们需要设计一个“日志类”,设名为 “Loger”。借助该类的某个对象,我们希望它在使用上,和 cout 等内置对象非常接近,但又能满足可同时向多个日志保存位置输出,比如屏幕(固定)或文件(可选)。

视频

我们在书本原有内容的基础上,增加了日志流改进(更贴近企业项目),升级内容(含第四步视频及完整文字课程)需付费购买。