【OSG】超級指針

前言

當你申請一個資源的時候,當你使用超級指針來管理這個資源的時候,你不必關心它何時被釋放,如何被釋放;在這裏推薦一個文檔輔助大家理解《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的源碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章