博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
阅读量:4066 次
发布时间:2019-05-25

本文共 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"#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();}//--

程序运行结果如下图:

=======

你可能感兴趣的文章
maven 下搭建spring
查看>>
maven下搭建注解形式的Spring aop
查看>>
SSH性能优化 转
查看>>
spring 事务
查看>>
Linux web工程部署远程必备软件安装
查看>>
Windows 7下硬盘安装CentOS6.4的解决方法
查看>>
JSP不支持EL表达式的解决方案
查看>>
Struts2类型转换器
查看>>
struts2 使用注解、反射、拦截器实现基于方法的权限控制
查看>>
maven 架设 struts2 注解方式 权限控制
查看>>
struts2之多个文件上传
查看>>
struts2之单个文件上传
查看>>
struts2自定义拦截器 模拟session超时的处理
查看>>
面试技巧
查看>>
struts2之防止表单重复提交
查看>>
人不成熟的几大特征
查看>>
《礼仪73》、《处事22计》、《心态24条》、《伤心50句》、《学会长大20》
查看>>
人人都会变老
查看>>
oracle connect by用法
查看>>
Oracle 树操作(select…start with…connect by…prior)
查看>>