C++单例模式

关于c++单例模式,网上有很多说明,也很详细,多不赘述,最近有个工程,想到了单例模式,结果也没用上,这里记录一下代码,留作备用。

头文件:

#ifndef _CYCQUEUE_H_
#define _CYCQUEUE_H_
#include <string>
class CycQueue	//实现单例模式
{
public:
	static CycQueue* getInstance(int m_size = 0); //获取对象
	~CycQueue(void);
	void Add(char* data,int len);		//添加元素
	void Get(char* data,int len); 		//获取元素
	void JudSize();						//判断数据量大小
	void Print();
public:
	bool m_Iswrite;				   //判断是否在写
	bool m_Isread;				   //判断是否在读
private:
	//把复制构造函数和=操作符也设为私有,防止被复制	
	CycQueue(int m_size);   //队列大小
	CycQueue(const CycQueue&);
	CycQueue& operator=(const CycQueue&);
	static CycQueue* instance;

private:
			 
	int  m_readindex;		    //读指针
	int  m_writeindex;			//写指针
	int  m_totsize;				//指定队列大小
	int  m_cursize;             //当前大小
	char *m_Audio;				//队列
};

#endif

.cpp

#include "CycQueue.h"

#define M_SIZEBUFF 8192*4		//最少保留四次读取的数据量

CycQueue* CycQueue::instance(0);//这里必须要初始化
//在此处初始化
CycQueue* CycQueue::getInstance(int m_size)
{
	if(instance==NULL)
	{	
		instance = new CycQueue(m_size);
	}
	return instance;
}

CycQueue::CycQueue(int m_size)
{
	m_Audio = new char[m_size];//初始化队列大小
	memset(m_Audio,0,m_size);
	m_readindex = 0;
	m_writeindex =0;
	m_cursize = 0;
	m_totsize = m_size;
	m_Iswrite = false;
	m_Isread = false;
	return;
}
CycQueue::CycQueue(const CycQueue&)
{
}

CycQueue& CycQueue::operator=(const CycQueue&)
{
	return (*instance);
}

CycQueue::~CycQueue(void)
{
	delete[] m_Audio;
	return;
}

void CycQueue::Add(char* data,int len)
{
	 m_Iswrite = true;
	//长度超出循环覆盖
	if((m_writeindex+len)>m_totsize)//大于总长度
	{
	   int overlen = m_writeindex+len - m_totsize;  //超出长度部分
	   int curlen = len-overlen;						//可容纳长度
	   memcpy(m_Audio+m_writeindex,data,curlen);	//写入缓冲区	  
	   memcpy(m_Audio,data+curlen,overlen);			//写入缓冲区	 //覆盖原来
	   m_writeindex = (m_writeindex+len)%m_totsize;	//取余 写指针位置
	}else//长度不超出
	{
	   memcpy(m_Audio+m_writeindex,data,len);//写入缓冲区
	   m_writeindex+=len;
	}
	m_Iswrite = false;
	return;
}

void CycQueue::Get(char* data,int len) 	//获取元素
{
	m_Isread = true;
	if(m_readindex+len>m_totsize)//取数据大于长度
	{
	   int overlen =  m_readindex+len - m_totsize;	//超出部分长度
	   int curlen = len-overlen;			   //可用长度
	   memcpy(data,m_Audio+m_readindex,curlen);
	   memcpy(data+curlen,m_Audio,overlen);
	   m_readindex = (m_readindex+len)%m_totsize;	//取余 读指针位置
	}else
	{
		memcpy(data,m_Audio+m_readindex,len);
		m_readindex+=len;
	}
	m_Isread = false;
	return;
}

void CycQueue::JudSize()//判断数据量大小
{
  	int m_ressize = (m_writeindex+m_totsize-	m_readindex)%m_totsize;	//可读空间大小
	int m_freesize = m_totsize - m_ressize;		//可写空间大小 
	if(m_ressize < M_SIZEBUFF)	
		//仅可写

	if(m_freesize < M_SIZEBUFF)
		//仅可读

	return;

}

void CycQueue::Print() 	//获取元素
{
	printf("m_readindex:%d m_writeindex:%d \n",m_readindex,m_writeindex);//指针位置
	int m = 0;
	while(m<m_totsize)
	{
	  printf("%c \n",m_Audio[m]);
	  m++;
	}
	return;
}

测试:

#include "CycQueue.h"
#include "CycQueData.h"
#if 1
void PrintA(char data[],int size)
{  
	int m = 0;
	while(m<size)
	{
		printf("%c\n",data[m]);
		m++;
	}
	return;
}

int main ()
{
	CycQueue*m_que = CycQueue::getInstance(8);
	char buf[5] = {'A','B','C','D','E'};
	char data[3];
	m_que->Add(buf,5);
	m_que->Get(data,3);
	printf("========读取数据========\n");
	PrintA(data,3);
	printf("========写入数据========\n");
	m_que->Print();

	m_que->Add(buf,5);
	m_que->Get(data,3);
	printf("========读取数据========\n");
	PrintA(data,3);
	printf("========写入数据========\n");
	m_que->Print();
	getchar();
	delete m_que;
	return 0;
}
#endif

测试截图:

 

总结:

本来打算实现一个,可自行控制的读写操作的环状存储空间,后来发现了另一种更好的实现方式,这里就仅写了一半,留待以后有时间完善。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值