📄 resmgr.cpp
字号:
// 资源管理代码
// 作者: Janhail Luo
// 最后整理: 2003-03-03
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "ResMgr.h"
CResMgr* CResObject::m_pResMgr = 0;
//////////////////////////////////////////////////////////////////////
// Class CResObject
//////////////////////////////////////////////////////////////////////
CResObject::CResObject()
{
m_pData = 0;
m_pName = 0;
}
CResObject::~CResObject()
{
DestroyObject();
}
void CResObject::CreateObject(const char* pResName)
{
// 如果资源管理类没有实例,就创建一个实例
if (m_pResMgr==NULL)
{
m_pResMgr = new CResMgr();
}
// 如果当前对象中包含有资源,就销毁这个资源
if (m_pData!=NULL)
{
this->DestroyObject();
}
// 注册这个资源
m_pResMgr->RegisterRes(this, pResName);
}
void CResObject::DestroyObject()
{
if (m_pResMgr!=NULL)
{
if (m_pData)
{
// 注销这个资源
m_pResMgr->UnregisterRes(this);
// 如果资源管理类里面没有保存任何资源
if (m_pResMgr->Empty())
{
// 删掉资源管理类
delete m_pResMgr;
m_pResMgr = 0;
}
m_pData = 0;
m_pName = 0;
}
}
}
void CResObject::OnDestroyObject()
{
}
void* CResObject::GetData()
{
return m_pData;
}
const char* CResObject::GetName()
{
return m_pName;
}
//////////////////////////////////////////////////////////////////////
// Class CResObject
//////////////////////////////////////////////////////////////////////
CResMgr::CResMgr()
{
}
CResMgr::~CResMgr()
{
}
void CResMgr::RegisterRes(CResObject* pResObj, const char* pName)
{
// 资源的名字
string name = pName;
// 在列表中查找资源
map<string, SItem>::iterator it = m_Item.find(name);
// 如果找不到资源
if (it==m_Item.end())
{
SItem item;
// 创建一个资源
item.pData = pResObj->OnCreateObject(pName);
printf("Create resource: %s\n", pName);
// 把创建的资源加入到资源列表中
m_Item[name] = item;
it = m_Item.find(name);
}
// 给对象的数据指针和名字指针赋值
pResObj->m_pData = (*it).second.pData;
pResObj->m_pName = (*it).first.c_str();
// 把对象加入到使用资源的列表中
(*it).second.objList.push_back(pResObj);
printf("Insert res object\n");
}
void CResMgr::UnregisterRes(CResObject* pResObj)
{
// 资源的名字
string name;
if (pResObj->m_pName==NULL) name = "";
else name = pResObj->m_pName;
// 取得使用资源的对象列表
SItem* pItem = &(m_Item[name]);
// 查找
list<CResObject*>::iterator it;
it = find(pItem->objList.begin(), pItem->objList.end(), pResObj);
// 把查找到的对象删除
pItem->objList.erase(it);
printf("Remove res object\n");
// 如果已经没有对象使用这个资源
if (pItem->objList.empty())
{
// 销毁这个资源
pResObj->OnDestroyObject();
printf("Destroy resource: %s\n", pResObj->m_pName);
}
}
bool CResMgr::Empty()
{
return m_Item.empty();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -