本文共 2011 字,大约阅读时间需要 6 分钟。
一、单例模式
单例模式,有很多种写法,以下是我实践过的一种写法。记录下来。
关键:
(1)使用的是引用,而不是指针。虽然我很喜欢用指针,但是在此处,我认为引用更合适。
(2)据说这是可以用于多线程的。
代码如下:logger.h .
//---------#ifndef _LOGGER_H#define _LOGGER_H#include#incldue typedef enum _LogLevel { debug = 0, info, warning, error}LogLevel;class Logger{public : static Logger& getInstance() { static Logger instance; return instance; } void writelog(LogLevel state, std::string str); private: Logger() {}; Logger(Logger const&) {}; Logger& operator=(Logger const&) {}; ~Logger() {};}#endif//--
logger.cpp 代码如下 .
//--#include "Logger.h"#includevoid Logger::writelog(LogLevel state, std::string str){ switch (state) { case debug: std::cout << str << std::endl; break; case info: break; case warning: break; case error: break; }}//-
main.cpp 代码如下 .
//--#include "Logger.h"int main(int argc, char* argv[]){ std::string str("============"); Logger &log = Logger::getInstance(); log.writelog(debug, str);}//--
单例模式,无论懒汉,饿汉,终究是要做到多线程可用,最好不加锁。
在Linux环境下,执行
# g++ -o main main.cpp logger.cpp
二、
看完了上面的代码,自然而然的产生一个疑问,那就是 : 类的成员函数里面的static(静态)变量的作用域。
【先给结论】:
类的成员函数里面的static(静态)变量的作用域,是这个类。
即一个类只有一份,不属于某个单独的对象。
实践证明如下:
test.h 代码:
//--#ifndef TEST_H#define TEST_H#includeclass test{public: test(); void func() const;};#endif // TEST_H//--
test.cpp 代码
//--#include "test.h"test::test(){}void test::func() const{ static int sTestNum = 0; std::cout << "sTestNum = " << ++sTestNum << std::endl;}//--
main.cpp 代码如下:
//--#include#include "test.h"int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); test test01; test test02; std::cout << "test01 ########################" << std::endl; test01.func(); test01.func(); test01.func(); test01.func(); std::cout << "test01 ########################" << std::endl; std::cout << "test02 ########################" << std::endl; test02.func(); std::cout << "test02 ########################" << std::endl; return a.exec();}//--
程序运行结果如下图:
=======