ksacvet777.moy.su
Главная » Статьи » IT

sco способ борьбы с "висячими" указателями
Решение представляет собой два шаблонных класса:


Класс ссылка на объект: sco_object<class Type>
Класс сам объект: sco_object<class Type>



Принцип опять же прост:
класс объект хранит список указателей на него, а класс-ссылка содержит указатель но объект.

Как только объект "умирает" (деструктор), то он зануляет объект-ссылки, которые на него указывают.
Когда же "умирает" объект-ссылка, то она производит удаление из списка класса-объекта на который указывает.




Пример использования:

#include "sco_object.h"

int main()
{
    sco_reference<void> ref1;
    sco_reference<void> ref2;
    sco_reference<void> ref3;

    {
        sco_object<void> ob;

        ref1.assign_reference(&ob);
        ref2.assign_reference(&ob);
        ref3.assign_reference(&ob);


    }

    return 0;
}



Если словами не понятно, то смотреть код и погонять в отладке:


#pragma once

#include <assert.h>
#include <vector>
#include <string>

//-------------------------------------------------------------------------

template<class T>
class sco_reference;

template<class T>
class sco_object;


//-------------------------------------------------------------------------

template<class T>
class sco_reference
{
    friend sco_object<T>;

    sco_object<T>* m_to;

    void remove_from_object();

public:

     sco_reference() : m_to(NULL) {}

     sco_reference(const sco_reference<T>& a) 
     {
         *this = a;
     }

     sco_reference(sco_object<T>* ob) : m_to(NULL) 
     {
         assign_reference(ob);
     }

     ~sco_reference() 
     {
         remove_from_object();
     }


    
    bool has_object() const
    {
        return m_to != NULL;
    }

    sco_object<T>* operator -> ();

    sco_reference& operator = (const sco_reference& a)
    {
        assign_reference(a.m_to);
        return *this;
    }

    void assign_reference(sco_object<T>* ob);
    void assign_reference(sco_object<T>& ob);

};

//-------------------------------------------------------------------------

template<class T>
class sco_object 
{
    friend sco_reference<T>;

    std::vector< sco_reference<T>* > m_references;

public:

    sco_object() 
    {

    }

    ~sco_object() 
    {
        for( std::vector<sco_reference<T>*>::iterator it=m_references.begin(); it != m_references.end(); ++it )
        {
            sco_reference<T>* pr = *it;
            pr->m_to = NULL; 
        }
    }


};








Категория: IT | Добавил: ksacvet777 (26.02.2014)
Просмотров: 309 | Теги: способ, указатель, pointer, CPP, борьба, cplusplus | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: