学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域

本文介绍了单例模式的一种实现方式,并通过实例演示了其在多线程环境下的应用。此外,还探讨了C++中类成员函数内静态变量的作用域特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、单例模式


单例模式,有很多种写法,以下是我实践过的一种写法。记录下来。

关键:

(1)使用的是引用,而不是指针。虽然我很喜欢用指针,但是在此处,我认为引用更合适。

(2)据说这是可以用于多线程的。


代码如下:logger.h                                .

//---------
#ifndef _LOGGER_H
#define _LOGGER_H

#include <iostream>
#incldue <string>

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 <stddef.h>

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



二、C++ 类成员函数中的静态变量的作用域

看完了上面的代码,自然而然的产生一个疑问,那就是  : 类的成员函数里面的static(静态)变量的作用域。

【先给结论】:

           类的成员函数里面的static(静态)变量的作用域,是这个类。

           即一个类只有一份,不属于某个单独的对象。


实践证明如下:


test.h 代码:

//--
#ifndef TEST_H
#define TEST_H

#include <iostream>

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 <QCoreApplication>
#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();
}


//--



程序运行结果如下图:



=======

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值