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

Steven Davidson srd4121 en njit.edu
Mar Mayo 1 22:10:32 CEST 2012


Hola Redondo,

On 5/1/2012 3:05 PM, redondo.af wrote:
> 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
>
>

Tal y como indican los mensajes, no puede encontrar 'setSiguiente(nodo 
&)' ni tampoco puede realizar una asignación porque los tipos no concuerdan.

En primer lugar, escribes un prototipo de 'setsiguiente()' en 
"clsCola.h" así:

class nodo
{
public:
   void setSiguiente( nodo );
   ...
};

Pero en su implementación, sólo aparece esta definición en "clsNodo.cpp":

void nodo::setSiguiente( nodo &val )

Los prototipos NO concuerdan así que estás intentando sobrecargar esta 
función miembro, pero no has declarado esta versión dentro de la clase 
'nodo'.

La solución es usar el mismo prototipo para la definición. Sin embargo, 
aconsejo usar 'const nodo &'; esto es,

class nodo
{
public:
   void setSiguiente( const nodo &val );
   ...
};
...
void nodo::setSiguiente( const nodo &val )  {...}

En cuanto al segundo error, la asignación que intentas hacer es la 
siguiente:

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

Si nos fijamos en los tipos de dato estás intentando hacer esto:

<nodo *> = <nodo>

No hay ninguna regla semántica para la asignación que acepte valores de 
estos tipos.

Basándome en 'getSiguiente()', creo que la solución es acceder al nodo 
apuntado por 'siguiente' y asignar el nuevo valor de 'val'; esto es,

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

>
> 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í. ;-)
>

De nada; para eso estoy. De todas maneras, soy uno más en la lista; hay 
muchos socios y socias que también ayudan.


Espero que lo anterior te sirva.

Steven





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