[C con Clase] Acceso a atributo privado de una clase. No lo consigo

redondo.af redondo.af en gmail.com
Jue Mayo 3 18:32:24 CEST 2012


Hola a todos:

No se como puedo acceder al atributo de una clase. He mirado el tema "41. Punteros a miembros" pero no consigo aclararme.

Me da un error de compilación en el procedimiento

void recorrerCola(cola &vlCola){ } que está dentro de procesos.cpp ya que no se como acceder a atributo valor de la clase nodo, despues de definir una instancia de esta clase llamada actual.

 void recorrerCola(cola &vlCola){    
 
  nodo *actual = new nodo();
  int valor;
  nodo *aux;

   
   actual=vlCola.getPrimero();
   valor = actual::getValor();
   aux = actual::getSiguiente();
   
  
}


Los errores que me dan son:

55 procesos.cpp In function `void recorrerCola(cola&)' `actual' is not a class or namespace  `getValor' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.)


56 procesos.cpp In function `void recorrerCola(cola&)' `actual' is not a class or namespace  `getSiguiente' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) 


Siento mucho la lata que os estoy dando. Pero es que son muchos conceptos nuevos 


Mil gracias de nuevo





*************************************************************************
***** main.cpp



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

#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;
}




****************************************************************************
*******  cola.h

#ifndef CLSCOLA_H 
     #define CLSCOLA_H 


     class nodo {
        public:

          nodo(); //  siguiente(NULL){}
         ~nodo();  
         
         int getValor();
		 void setValor(int);
		 
		 nodo getSiguiente();
		 void setSiguiente(const nodo &val);
		 
		 
        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();
         void recorrer();
//    void insertar(string nombre,tProductos productos);

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


************************************************************
****** nodo.cpp


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

#include "clsCola.h"

nodo::nodo() { siguiente=NULL; } 
nodo::~nodo(){}

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

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

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

void nodo::setSiguiente(const nodo &val)
{ *siguiente = val; }


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

****Cola.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();
   
  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;
   }
   
  
}

int cola::consultarNodo(pNodo nodoCola){}



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

#ifndef PROCESOS_H 
   #define PROCESOS_H 

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

****************************************************************************
***** 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){ 
     
 nodo *actual = new nodo();
 
 int valor;
 nodo *aux;

   
   actual=vlCola.getPrimero();
   valor = actual::getValor();
   aux = actual::getSiguiente();
  
}
     
  
//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;
        } 
     
     }



#endif
#ifndef CLSCOLA_H 
     #define CLSCOLA_H 


     class nodo {
        public:

          nodo(); //  siguiente(NULL){}
         ~nodo();  
         
         int getValor();
		 void setValor(int);
		 
		 nodo getSiguiente();
		 void setSiguiente(const nodo &val);
		 
		 
        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();
         void recorrer();

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



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