|
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.
1.7.4