《C++沉思录》27章内容修改后所得:

 /************************************************************************/
/* Trace类,以及trace类输出重定向,C++沉思录27章 */
/************************************************************************/
#pragma once
#include <iostream>
using namespace std; //打开/关闭trace输入输出流
static const int trace_debug = ; //输出流
class Channel
{
public:
Channel (ostream* o = &std::cout): trace_file(o){}
//重定向输出流
void Reset(ostream* o = &std::cout)
{
trace_file = o;
}
private:
friend class Trace;
template<class T> friend class Obj_trace;
ostream* trace_file;
};
typedef CSingleton<Channel> TraceChannel; class Trace
{
public:
Trace(const char* s,Channel* c = TraceChannel::Instance())
{
if (trace_debug)
{
name = s;
cp = c;;
if (cp && cp->trace_file)
{
*cp->trace_file << "Trace begin : " << name << endl;
}
}
}
~Trace()
{
if (trace_debug)
{
if (cp && cp->trace_file)
{
*cp->trace_file << "Trace end : " << name <<endl;
}
}
}
private:
Channel* cp;
const char* name;
}; //传递类名给Obj_trace,可以作为待跟踪类的基类或成员变量存在
template<class T>
class Obj_trace
{
public:
Obj_trace(Channel* c = TraceChannel::Instance()) : ct(++count)
{
if (trace_debug)
{
cp = c;
if (cp && cp->trace_file)
{
*cp->trace_file << "Trace obj begin : " << typeid(T).name() << " "<< ct << " constructed" << endl;
}
}
}
~Obj_trace()
{
if (trace_debug)
{
if (cp && cp->trace_file)
{
*cp->trace_file << "Trace obj end : " << typeid(T).name() << " "<< ct << " destoryed" << endl;
}
}
}
private:
Channel* cp;
const char* name;
static int count;
int ct;
}; //每个不同的type类型都有唯一对应的count
template<class T>
int Obj_trace<T>::count = ;

简单Trace类实现的更多相关文章

  1. System.Diagnostics命名空间里的Debug类和Trace类的用途

    在 .NET 类库中有一个 System.Diagnostics 命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类--Debug ...

  2. debug类和trace类的区别

    在 .net 类库中有一个 system.diagnostics 命名空间,该命名空间提供了一些与系统进程.事件日志.和性能计数器进行交互的类库.当中包括了两个对开发人员而言十分有用的类——debug ...

  3. 基于Android 下载文件时,更新UI简单帮助类

    因为在项目开发时.有这种简单需求,问谷歌,网络上也有好多Utils工具类,可是比較冗余.自己就简单的写了一个简单帮助类. /** * 下载文件,更新UI简单帮助类 * * @author jarlen ...

  4. Java基础_0305:简单Java类

    简单Java类 简单Java类是一种在实际开发之中使用最多的类的定义形式,在简单Java类中包含有类.对象.构造方法.private封装等核心概念的使用,而对于简单Java类首先给出如下的基本开发要求 ...

  5. Golang简单日志类

    实现简单的日志写入文件功能运行环境:golang1.4.2+win7x64golang1.4.2+centos6.5×64 package Helper import ( “fmt” “log” “o ...

  6. 玩转TypeScript(1) --定义简单的类

    相对于JavaScript来说,TypeScript增强了强制类型,同时添加了一系列的面向对象的特性,包含:静态类型(Static typing).类(Classes).接口(Interfaces). ...

  7. JAVA基础学习之路(四)定义简单java类

    简单java类开发一般原则: 类名称必须有意义,再怎么说,要让人家看的明白吧 类之中所有属性必须使用private封装,并提供setter,getter方法 类之中可以有多个构造方法,但是必须保留有一 ...

  8. java基础之JDBC三:简单工具类的提取及应用

    简单工具类: public class JDBCSimpleUtils { /** * 私有构造方法 */ private JDBCSimpleUtils() { } /** * 驱动 */ publ ...

  9. C++_类继承1-从一个简单的类开始

    面向对象编程的主要目的之一是:提供可重用的代码.尤其是项目很庞大的时候,重用测试过的代码比重新编码代码要好得多. C++提供了更高层次的重用性.其中之一就是继承这个概念. 一些厂商提供了类库.类库由类 ...

随机推荐

  1. 所有版本chromedriver下载

     所有版本chromedriver下载 http://chromedriver.storage.googleapis.com/index.html

  2. Decorate设计模式

    定义:装饰器设计模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.不改变对象的情况下,动态增加其功能. • 需要扩展一个类的功能,或给一个类添加附加的成员. • 需要动态地给一个对象增 ...

  3. 巨蟒python全栈开发-第7天 基本数据类型补充&深浅拷贝

    1.基本数据类型补充 2.深浅拷贝 DAY7-基本数据类型(基本数据类型补充&深浅拷贝) 本节主要内容: 1.补充基础数据类型 (1)join方法 (2)split方法 (3)列表不能在循环时 ...

  4. T420 开启麦克风

    买来之后一直没注意过麦克风的问题,今天基友们群视频,才发现我的机器是哑的 打开录音设备,发现没有设备 重装驱动无果 打开BIOS,在安全选项——IO/Access中将Microphone 设为 Ena ...

  5. php and mysql pear的安装

    http://www.cnblogs.com/bugY/archive/2012/07/06/2578972.html 什么是PEAR 来自百度百科:PEAR是PHP扩展与应用库(the PHP Ex ...

  6. Java 语言基础之运算符

    使用运算符之后,肯定有返回结果. 六种运算符: 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 三元运算符 1. 算术运算符 加(+), 减(-), 乘(*), 除(/), 取余(%), 自 ...

  7. 【opencv安裝】ubuntu16 opencv安装+测试

    ubuntu16.04 install opencv2.4 to python2 and c++ 四大主流库比较: 对OpenCV的印象:功能十分的强大,而且支持目前先进的图像处理技术,体系十分完善, ...

  8. java中jdk安装配置信息

    由于被人比较懒,有些做过的事情总是好忘,这个也不例外,索性就做个随笔. JAVA_HOMEC:\Program Files (x86)\Java\jdk1.7.0_03CLASSPATH.;%JAVA ...

  9. Angular 学习笔记 :初识 $digest , $watch , $apply,浅析用法 。

    传统的浏览器事件循环 :浏览器本身一直在等待事件,并作出响应.如果你点击一个button或者在input 中输入字符,我们在 JS 中 监听这些事件并设定了回调函数,那么这些事件被触发以后,回调函数就 ...

  10. django【orm操作】

    一.ORM表结构 class Publisher(models.Model): name = models.CharField(max_length=30, verbose_name="名称 ...