[C con Clase] Nueva duda con listas abiertas

Roland raedura en yahoo.es
Mie Oct 24 02:55:22 CEST 2007


De nuevo saludos a todos.

Ahora me ocurre lo siguiente:

Dispongo de una lista abierta (llamada listaClase), y una clase (denominada ClaseA), que contiene un método (llamado DevolverDat) que pretende obtener datos de la lista abierta sin tener que solicitarlo a través del "Main".

Cuando ejecuto este programa, compuesto por tres ficheros, me da el valor del miembro de la lista abierta la primera vez que llamo al método "Operar.DevolverDat (Operar2)", pero a partir de ahí, todas las peticiones posteriores me dan datos erróneos, como si se hubiese activado el destructor de la lista abierta. Si eso es así, ¿existe alguna forma de evitarlo?.

// **Programa principal**

#include <cstdlib>
#include <iostream>
#include "Claselista.h"
#include "Clasita.h"

using namespace std;

ClaseA Operar;
listaClase Operar2;

int main(int argc, char *argv[])
{
    Operar2.Insertar (12);
    Operar2.Insertar (14);
    cout << "z1 = " << Operar.DevolverDat (Operar2) << endl;
    // A partir de aquí todos los datos son erróneos.
    cout << "z2 = " << Operar2.DevolverDato () << endl;
    cout << "z3 = " << Operar.DevolverDat (Operar2) << endl;
    cout << "z4 = " << Operar2.DevolverDato () << endl;
    Operar2.Borrar ();
    system("PAUSE");
    return EXIT_SUCCESS;
}

// -------------------------------------
// **ClaseA**

#include <cstdlib>
#include <iostream>

using namespace std;

class ClaseA {
   public:
      int DevolverDat (listaClase Operarbis);
      
      friend class listaClase;
      };


int ClaseA::DevolverDat (listaClase Operarbis)
{
     return Operarbis.DevolverDato();
}

// -------------------------------------
// **Lista abierta**

#include <cstdlib>
#include <iostream>

using namespace std;

class nodito {
   public:
    
    nodito(int x, nodito *sig = NULL)
    {
       Posx = x;
       siguiente = sig;
    }
    
   private:
    int Posx;
    nodito *siguiente;
    
   friend class listaClase;
};
 
typedef nodito *pnodito;

class listaClase {
   private:
      pnodito primero;
      pnodito actual;
   public:
      listaClase() { primero = actual = NULL;}
      ~listaClase();
      
      void Insertar(int x);
      void Borrar();
      bool ListaVacia() { return primero == NULL; }
      int DevolverDato ();
      };

listaClase::~listaClase() {
   pnodito aux;
   
   while(primero) {
      aux = primero;
      primero = primero->siguiente;
      delete aux;
   }
   actual = NULL;
}

void listaClase::Insertar(int x)
{
   pnodito anterior;
 
   // Si la lista está vacía
   if(ListaVacia())
   {
      // Asignamos a lista un nuevo nodo de valor y
      // cuyo siguiente elemento es la lista actual                    
      primero = new nodito(x, primero);
      actual = primero;
   }
   else
   {
          anterior = primero;
          while(anterior->siguiente != NULL) anterior = anterior->siguiente;
          anterior->siguiente = new nodito(x, anterior->siguiente);
          actual = anterior->siguiente;
   }
}

void listaClase::Borrar() {
   pnodito aux;
   
   while(primero) {
      aux = primero;
      primero = primero->siguiente;
      delete aux;
   }
   actual = NULL;
}

int listaClase::DevolverDato()
{
     return actual->Posx;
}

Gracias por atender mi mensaje, y ojalá puedan darme una solución.


Más información sobre la lista de distribución Cconclase