一、单例模式
单例模式,有很多种写法,以下是我实践过的一种写法。记录下来。
关键:
(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"
#include
void 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
#include
class 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();
}
//--
程序运行结果如下图:
=======