lkptr - simple reference LinKed PoinTeR:
Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes
AutoRef Struct Reference

Clase que se auto-referencia. More...

List of all members.

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< AutoRefm_otro
 Enlace circular a otro objeto.

Static Public Attributes

static int m_cont = 0
 Cantidad total de objetos.

Detailed Description

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

See also:
test_lkptr<E>::test_lkptr_cycle()

Definition at line 637 of file test_lkptr.cpp.


Constructor & Destructor Documentation

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.


Member Function Documentation

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.


Member Data Documentation

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.


The documentation for this struct was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines