[C con Clase] Problema de compilación en una función con punteros

redondo.af redondo.af en gmail.com
Mar Mayo 1 21:05:37 CEST 2012


Buenas tardes:

Estoy implementado una cola y tengo un error en la compilación cuando defino en la clase clsNodo.cpp la función:

void nodo::setSiguiente(nodo &val)
{ this->siguiente = val; }

Los errores son:

19 clsNodo.cpp prototype for `void nodo::setSiguiente(nodo&)' does not match any in class `nodo' 
17 clsCola.h void nodo::setSiguiente(nodo) 

19 clsNodo.cpp In member function `void nodo::setSiguiente(nodo&)'cannot convert `nodo' to `nodo*' in assignment


 
Os pongo a continuación el código correspondiente a las distintas clases que forman el programa.

Antes de nada dar las gracias a Steven por su aportación a este foro, sin ella yo no hubiese podido llegar hasta aquí. ;-)



Ahí vamos con el código....


****************************************************************************************************************

******main.cpp


#include "clsCola.h"
#include "procesos.h"


int main(int argc, char *argv[])
{
     int op, opsub; 
     cola Cola;
    do 
    { 
         
      op = mostrarMenuMain(); 
 
        switch (op) //hace casting automatico a int p 

        { 
            case 0: 
                cout <<"\n\t >  ¡Adios!\n"; 
                break; 
            case 1: // practica1 = Cola 
                 do{
                   opsub = mostrarMenuCola(); 
                   tratarOpcionCola(opsub, Cola);
                 }while(opsub!=0);
                break; 
            case 2: // practica 2 
                cout << "\n\t >  practica2\n"; 
                break; 
         case 3: // practica 3 
                cout << "\n\t >  practica3\n"; 
                break; 
        } 
    }while(op!= 0); 
    system("PAUSE");
    return EXIT_SUCCESS;
}




***************************************************************************************************************
*********clsCola.h


#ifndef CLSCOLA_H 
     #define CLSCOLA_H 


     class nodo {
        public:
        nodo(int v, nodo *sig = NULL)
         {
            valor = v;
            siguiente = sig;
         }

         int getValor();
		 void setValor(int);
		 
		 nodo getSiguiente();
		 void setSiguiente(nodo);
		 
		 
        private:
           int valor;
           nodo *siguiente;
        
        friend class cola;
     };
 
     typedef nodo *pNodo;
 

     class cola {
        public:
         cola(); // : primero(NULL), ultimo(NULL) {}
         ~cola();
         
         pNodo getPrimero();
		 void setPrimero(pNodo);
    
          pNodo getUltimo();
		 void setUltimo(pNodo);
		 
         bool esVacia();
         void anadir(int p);
         void borrar();
         int consPrimero(pNodo nodoCola);
         void recorrer();
//    void insertar(string nombre,tProductos productos);

         private:
           pNodo primero, ultimo;
           int total;
      };
      typedef cola *pCola;
      
#endif


***************************************************************************************************************
*********clsCola.cpp

#include <cstdlib>
#include <iostream>
using namespace std;

#include "clsCola.h"

cola::cola() { primero=NULL; ultimo=NULL;} 
cola::~cola(){}

pNodo cola::getPrimero()
{ return this->primero; }

void cola::setPrimero(pNodo prim)
{ this->primero = prim; }

pNodo cola::getUltimo()
{ return this->ultimo; }

void cola::setUltimo(pNodo ult)
{ this->ultimo = ult; }



bool cola::esVacia()
{
	return (primero==NULL && ultimo==NULL);

}

void cola::anadir(int ped)
{
 pNodo nuevo;
   nuevo = new nodo(ped);
   
  if(esVacia()) //si esta vacia se asigna a la cabecera
	{
		primero=nuevo;
		ultimo=nuevo;
	}
	else
	{   
        ultimo->siguiente = nuevo;
		ultimo=nuevo;
	}
   
}

void cola::borrar()
{
 pNodo aux;
   
   aux=primero;
   primero= aux->siguiente;
   aux->siguiente=NULL;
// Si primero es NULL es que había un único elemento
   if (primero==NULL){
      ultimo=NULL;
   }
   
  
}


}

***************************************************************************************************************
*******procesos.h


#ifndef PROCESOS_H 
   #define PROCESOS_H 

    int mostrarMenuMain();
    int mostrarMenuCola(); 
    void recorrerCola(cola &b);
    void tratarOpcionCola(int a, cola &b);


#endif


***************************************************************************************************************
******procesos.cpp


#include <string> 
using std::string;
#include <iostream> 
using std::cin;
using std::cout;

#include "clsCola.h"
#include "procesos.h"

int mostrarMenuMain (){
  int op; 
                   
      system("cls");
		cout <<"\n    Prácticas de Estructura de datos 2011/2012   ";
		cout <<"\n ------------------------------------------------"; 
		cout <<"\n 1. Práctica 1: Colas";
		cout <<"\n 2. Práctica 2: Listas";
		cout <<"\n 3. Práctica 3: Árboles";
		cout <<"\n ";
		cout <<"\n 0. Salir";
		cout <<"\n\n Opción:  ";
		cin >> op;  
        return op;   
}


int mostrarMenuCola(){
  int op; 
             
      system("cls");
     
      cout << "\n        Gestión de Colas de Pedidos";
      cout <<"\n -----------------------------------------"; 
      cout <<"\n "; 
      cout <<"\n 1. Añadir un pedido a cola"; 
      cout <<"\n 2. Servir el primer pedido de la cola"; 
      cout <<"\n 3. Consultar el primer pedido en cola"; 
      cout <<"\n 4. Determinar si hay pedidos pendientes en cola"; 
      cout <<"\n "; 
      cout <<"\n 0. Salir"; 
      cout <<"\n\n Opcion:  "; 
      cin >>  op; 
     return op;   
}

void recorrerCola(cola &vlCola){ 
     
   pNodo actual, fin;
   int valor;
   
   actual=vlCola.getPrimero();
   fin=vlCola.getUltimo();
   
   while (actual!=fin){
        cout << "\n nº pedido = ";
//         valor= vlCola.consPrimero(actual);
         cout << valor;   
 //        actual=actual->siguiente;   
         
   }
 /*     cout << "\n nº pedido = ";
      cout << actual->valor; */
     
}
     
  
//void tratarOpcionCola(int op){ //falta cola de tipo cola
void tratarOpcionCola(int op, cola &vlCola){ //falta cola de tipo cola
     int num_ped;
     char resp;
    
     switch (op) //hace casting automatico a int p 

        { 
            case 0: 
                cout <<"\n\t >  ¡Vuelves al menú principal!\n"; 
                system("PAUSE");
                break; 
            case 1: // practica1 = Cola 
                system("cls");
                cout <<"\n pedido:  ";
                cin >>  num_ped; 
                vlCola.anadir(num_ped);
                break; 
            case 2: // practica 2 
             if (vlCola.esVacia()){  
                       cout <<"\n No hay pedidos en cola";
                       cout <<"\n"; 
                  } else{
                      system("cls");
                      cout <<"\n Va a borrar el primer pedido de la cola.";
                      cout <<"\n¿Desea continuar? S/N:  ";
                      cin >> resp ;
                      if ((resp== 'S') && (resp=='s')){      
                          vlCola.borrar();       
                          }else{
                      
                      
                          }
                  }
//               if (resp=='S'){}
               break;
            case 3: // practica 3 
                printf ("\n\t >  practica3\n"); 
                break; 
                
            case 4: // Determinar si hay pedidos pendientes
                system("cls");
                if (vlCola.esVacia()){  
                       cout <<"\n No hay pedidos pendientes en cola";
                       cout <<"\n"; 

                  } else
                  
                  {  cout <<"\n Existen los siguientes pedidos pendientes:"; 
	                 cout <<"\n" ; 
 //                    vlCola.recorrer(); 
                     recorrerCola(vlCola);       
                  }
                   system("PAUSE");
                   break;
        } 
     
     }




**************************************************************************************************************
************  clsNodo.cpp


#include <cstdlib>
#include <iostream>
using namespace std;

#include "clsCola.h"


int nodo::getValor()
{ return this->valor; }

void nodo::setValor(int val)
{ this->valor = val; }

nodo nodo::getSiguiente()
{ return *siguiente; }

void nodo::setSiguiente(nodo &val)
{ this->siguiente = val; }




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