C++简单的Logger
第一次用markdown编辑,感觉确实很好用。做了下楼赛的题目,下面做做笔记留下标记学习。
- 主要知识点
- 单例模式
- 智能指针
easyLogger.h
#pragma once
#include <memory>
#include <ctime>
#include <iostream>
#include <fstream>
using namespace std;
class easyLogger
{
public:
static easyLogger *myInst(){
if (NULL == _instance.get()){
_instance.reset(new easyLogger);
}
return _instance.get();
}
void Log(const string& logInfo);
private:
easyLogger(void){}
virtual ~easyLogger(void){}
friend class auto_ptr<easyLogger>;
static auto_ptr<easyLogger> _instance;
};
// 初始化_instance
auto_ptr<easyLogger> easyLogger:: _instance;
void easyLogger::Log(const string& logInfo) {
ofstream ofs;
time_t t = time(0);
char tmp[64];
// [2017.07.12 13:50:36 Wednesday]
strftime(tmp, sizeof(tmp), "[%Y.%m.%d %X %A]", localtime(&t));
// 写easyLogger.log文件
ofs.open("shiyanloulogger.log",ofstream::app);
ofs.write(logInfo.c_str(), logInfo.size());
ofs << tmp << endl;
ofs.close();
}
loggertest.cpp
#include "easyLogger.h"
int main() {
easyLogger::myInst()->Log("logger info");
return 0;
}
- 1.单例模式三个关键点:
- 1)私有的静态实例对象 private static instance
- 2)私有的构造函数 private Singleton()
- 3)公有的静态访问实例对象的方法 public static Singleton getInstance()
类的静态成员变量必须在类外进行初始化
详见:http://blog.csdn.net/ayj12345/article/details/78551260
- 2.智能指针
- C++中指针申请内存,new/delete由用户决定对象的生命期。而智能指针是对普通指针进行封装,使得智能指针能方便地管理一个对象的生命期,自动执行对象的释放,实现内存的自动回收,也有说智能指针为了垃圾回收,其实都是一个意思。
- 智能指针一个关键是使用引用计数用于对象生存期控制。每次创建类的新对象时,初始化指针并将引用计算置1;党对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,析构函数减少引用计数(如果引用计数减至0,则删除对象)。
- auto_ptr常用成员函数:
- get() 返回auto_ptr指向的那个对象的内存地址。
- reset() 重新设置auto_ptr指向的对象。
- 这里还有一个地方:fiend class auto_ptr;
将auto_ptr作为easyLogger类的友元,这样auto_ptr类能访问easyLogger类的私有成员。