在设计一个类时按照你功能需求设计为单例模式,采用的是饱汉模式,饱汉模式,顾名思义就是不着急创建对象,在需要使用的时候才进行创建对象。但是编译时遇到一个错误,感觉很奇怪,如下所示:
D:\qt_project\sample\IntegrationAppUIFrame\pageitemmanager.cpp:4: error: 'pageItemManager::pageItemManager' names the constructor, not the type
static pageItemManager::pageItemManager* m_instance = 0;
^
很多朋友可能一下子就看出问题所在了,这里就不饶弯子了,问题的原因就是在对static类型的变量在初始化时首先不需要携带static关键字,其次是类的修饰符不能修饰类型,需要类的修饰符去修饰变量。直接上代码(该代码是一个单例模式饱汉模式的代码实例,仅供参考):
#include "pageitemmanager.h"
#include <QDebug>
pageItemManager* pageItemManager::m_instance = 0; //正确
static pageItemManager::pageItemManager* m_instance = 0; //错误,这里是错误的,违反了上文说的两点,不应该有static关键字,pageItemManager::应该去修饰变量,而不是修饰类型
pageItemManager::pageItemManager(QObject *parent) : QObject(parent)
{
};
void pageItemManager::addPageItem(pageItem *item)
{
m_vPageList.push_back(item);
return;
}
void pageItemManager::deletePageItem(pageItem *item)
{
int index = 0;
foreach (pageItem* var, m_vPageList) {
if(var == item)
{
m_vPageList.remove(index,1);
break;
}
index++;
}
#ifdef FUN_DEBUG_MODE
qDebug()<<"deletePageItem the lenth of vector : "<<m_vPageList.size();
#endif
return;
}
void pageItemManager::AddPageItemFront(pageItem *item)
{
m_vPageList.push_front(item);
return;
}
void pageItemManager::clearAllItems()
{
m_vPageList.clear();
return;
}
int pageItemManager::getPageItemNum()
{
return m_vPageList.size();
}
pageItem* pageItemManager::getPageItemByIndex(int index)
{
return m_vPageList.at(index);
}
头文件如下:
#ifndef PAGEITEMMANAGER_H
#define PAGEITEMMANAGER_H
#include <QObject>
#include "pageitem.h"
#include <QVector>
//该类设计为单例模式
class pageItemManager : public QObject
{
Q_OBJECT
public:
void addPageItem(pageItem* item); //在vector的尾部插入item
void deletePageItem(pageItem* item); //删除指定item
void AddPageItemFront(pageItem* item); //在vecotor的头部插入item
void clearAllItems(); //清空vecotr中所有的item项
int getPageItemNum(); //获取item项个数
pageItem* getPageItemByIndex(int index); //根据索引获取item对象
//饱汉模式
static pageItemManager* GetInstance()
{
if(!m_instance)
{
m_instance = new pageItemManager();
}
return m_instance;
}
private:
QVector<pageItem*> m_vPageList; //用于保存所有的pageitem项
static pageItemManager* m_instance; //静态成员变量,用于保存单例模式下类的实例
private:
pageItemManager(QObject *parent = nullptr); //构造函数
pageItemManager(const pageItemManager& manager); //拷贝构造函数
operator =(const pageItemManager& manager); //赋值构造函数
};
#endif // PAGEITEMMANAGER_H