前言
當你申請一個資源的時候,當你使用超級指針來管理這個資源的時候,你不必關心它何時被釋放,如何被釋放;在這裏推薦一個文檔輔助大家理解《OpenSceneGraph基本渲染理論》,這個文檔百度很多免費的可以閱讀。
思想
使用棧中的資源管理堆中的東西
實現代碼1
OSG環境已經配置好的基礎上,代碼只是爲了讓大家理解超級指針這個概念,有很多代碼的地方還是不太恰當,比如友元類的使用上,大家不必細究。
#include <iostream>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#ifdef _DEBUG
#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgGAd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgUtild.lib")
#pragma comment(lib, "osgViewerd.lib")
#else
#pragma comment(lib, "osg.lib")
#pragma comment(lib, "osgGA.lib")
#pragma comment(lib, "osgDB.lib")
#pragma comment(lib, "osgUtil.lib")
#pragma comment(lib, "osgViewer.lib")
#pragma comment(lib, "OpenThreads.lib")
#endif
class Real
{
public:
Real()
{
count = 0;
std::cout<<"Real has create"<<std::endl;
}
~Real()
{
std::cout<<"Real has Destroy"<<std::endl;
}
void ref()
{
count ++;
}
void unref()
{
count --;
if(!count)
{
delete(this);
}
}
private:
int count;
};
template <class T>
class ref_pter
{
public:
ref_pter()
{
_ptr = NULL;
}
ref_pter(T *ptr)
{
_ptr = ptr;
if(_ptr )
{
_ptr->ref();
}
}
~ref_pter()
{
if(_ptr)
{
_ptr->unref();
}
}
ref_pter operator = (T *pa)
{
T * temp = _ptr;
_ptr = pa;
if(_ptr)
{
_ptr->ref();
}
if(temp)
{
temp->unref();
}
return * this;
}
T* get()
{
return _ptr;
}
operator T *() const
{
return _ptr;
}
T* operator ->()
{
return _ptr;
}
T* operator *()
{
return _ptr;
}
private:
T * _ptr;
};
void main()
{
ref_pter<osgViewer::Viewer> viewer = new osgViewer::Viewer;
viewer->setSceneData(osgDB::readNodeFile("glider.osg"));
viewer->run();
}
實現代碼2
#include <iostream>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#ifdef _DEBUG
#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgGAd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgUtild.lib")
#pragma comment(lib, "osgViewerd.lib")
#else
#pragma comment(lib, "osg.lib")
#pragma comment(lib, "osgGA.lib")
#pragma comment(lib, "osgDB.lib")
#pragma comment(lib, "osgUtil.lib")
#pragma comment(lib, "osgViewer.lib")
#pragma comment(lib, "OpenThreads.lib")
#endif
class Real
{
public:
Real()
{
count = 0;
std::cout<<"Real has create"<<std::endl;
}
~Real()
{
std::cout<<"Real has Destroy"<<std::endl;
}
void ref()
{
count ++;
}
void unref()
{
count --;
if(!count)
{
delete(this);
}
}
public:
int count;
};
template <class T>
class ref_pter
{
public:
ref_pter()
{
_ptr = NULL;
}
ref_pter(T *ptr)
{
_ptr = ptr;
if(_ptr )
{
_ptr->ref();
}
}
~ref_pter()
{
if(_ptr)
{
_ptr->unref();
}
}
ref_pter operator = (T *pa)
{
T * temp = _ptr;
_ptr = pa;
if(_ptr)
{
_ptr->ref();
}
if(temp)
{
temp->unref();
}
return * this;
}
T* get()
{
return _ptr;
}
operator T *() const
{
return _ptr;
}
T* operator ->()
{
return _ptr;
}
T* operator *()
{
return _ptr;
}
private:
T * _ptr;
};
void main()
{
ref_pter<osgViewer::Viewer> viewer = new osgViewer::Viewer;
viewer->setSceneData(osgDB::readNodeFile("glider.osg"));
viewer->run();
}
*** 備註:其中的ref()函數和unref函數,都是osg本身的函數,所以名字只能叫這個,如果改一下函數名可能就會有錯誤,具體深入的瞭解,還要看一下OpenSceneGraph的源碼。