lkptr
|
Clase que se auto-referencia. More...
Public Member Functions | |
AutoRef () | |
Constructor (aumenta cuenta de objetos) | |
~AutoRef () | |
Destructor (libera lkptr<> ) | |
void | set (AutoRef *ptr) |
Entrelaza a ptr . | |
Static Public Member Functions | |
static int | cont () |
Contidad total de objetos. | |
Public Attributes | |
lkptr< AutoRef > | m_otro |
Enlace circular a otro objeto. | |
Static Public Attributes | |
static int | m_cont = 0 |
Cantidad total de objetos. |
Clase que se auto-referencia.
paco lola +---+ +---+ - Al destruir el "AutoRef" al que "paco" apunta | * | | * | el destructor lkptr<> destruye a lo que "lola" apunta +---+ +---+ | | - Antes de destruir el "AutoRef" al que "lola" apunta v v el destructor lkptr<> destruye a lo que "paco" apunta +-----+ +-----+ | *--|--->| | - Esto causa un ciclo infinito de invocaciones de los destructores | |<---|--* | +-----+ +-----+ - Por eso este programa se cae, pues tiene lkptr<>'s circulares AutoRef AutoRef
// AutoRef::Auto-Referencia struct AutoRef { static int m_cont; ///< Cantidad total de objetos lkptr<AutoRef> m_otro; ///< Enlace circular a otro objeto AutoRef() { m_cont++; } ///< Constructor (aumenta cuenta de objetos) ~AutoRef() { m_cont--; #ifndef AutoRef_BOOOOMMMM m_otro.weak_release(); #endif } ///< Destructor (libera \c lkptr<>) void set( AutoRef * ptr ) { m_otro.reset( ptr ); } ///< Entrelaza a \c ptr. static int cont() { return m_cont; } ///< Contidad total de objetos }; int AutoRef::m_cont = 0; /// Muestra como no es posible que \c lkptr<> maneje algunos ciclos correctamente. template <class E> void test_lkptr<E>::test_lkptr_cycle() { if (false) // blows when executed {{ // test::lkptr_cycle() if ( true ) { assertTrue( AutoRef::cont() == 0 ); lkptr<AutoRef> paco ( new AutoRef() ); assertTrue( AutoRef::cont() == 1 ); lkptr<AutoRef> lola ( new AutoRef() ); assertTrue( AutoRef::cont() == 2 ); paco->set( lola.get() ); lola->set( paco.get() ); } assertTrue( AutoRef::cont() == 0 ); }} } // AutoRef::Auto-Referencia
Definition at line 637 of file test_lkptr.cpp.
AutoRef::AutoRef | ( | ) | [inline] |
Constructor (aumenta cuenta de objetos)
Definition at line 640 of file test_lkptr.cpp.
AutoRef::~AutoRef | ( | ) | [inline] |
Destructor (libera lkptr<>
)
Definition at line 641 of file test_lkptr.cpp.
void AutoRef::set | ( | AutoRef * | ptr | ) | [inline] |
Entrelaza a ptr
.
Definition at line 647 of file test_lkptr.cpp.
static int AutoRef::cont | ( | ) | [inline, static] |
Contidad total de objetos.
Definition at line 648 of file test_lkptr.cpp.
int AutoRef::m_cont = 0 [static] |
Cantidad total de objetos.
Definition at line 638 of file test_lkptr.cpp.
Enlace circular a otro objeto.
Definition at line 639 of file test_lkptr.cpp.