[C con Clase] Referencias a objetos

Steven R. Davidson vze266ft en verizon.net
Lun Dic 11 16:40:09 CET 2006


Hola Reinel,

Reinel Hernández Peraza wrote:
> Hola amigos de la lista
> 

[CORTE]

> 
> Esta es la definición de mi clase cpatio. Estoy intentando devolver la 
> referencia a los objetos cPerro, y cGato que son miembros de mi clase 
> cPatio, pero me marca errores, tanto si uso:
> 
> return *(MisPerros[i]);
> 
> como si uso:
> 
> return *MisPerros[i];
> 

Aquí está el error. La evaluación de estas expresiones implica obtener 
un valor de un doble puntero. Como sabemos, 'MisPerros' no es un doble 
puntero, sino singular. La operación 'MisPerros[i]' accede al elemento 
de índice 'i' obteniendo un objeto de tipo 'cPerro'. Luego, aplicas el 
operador de acceso o de indirección '*' a tal objeto. Esto no tiene 
sentido, al menos que hayas sobrecargado el operador '*' para la clase 
'cPerro.

Ten presente que la función miembro 'Get_Perro()' retorna una 
referencia. Lingüísticamente, la referencia no tiene nada que ver con 
punteros. Tienes dos posibles soluciones a tu problema:
1. En lugar de retornar una referencia a un objeto, retorna la lista de 
objetos. Por ejemplo,

cPerro * Get_Perro()
{
   return MisPerros;
}

Esto implica que tendremos que acceder al objeto explícitamente del 
elemento de tal lista. Por ejemplo,

cPatio patio(10);
...
patio.Get_Perro()[5];

2. Corrige la expresión escrita a la siguiente:

cPerro & Get_Perro( int i )
{
   return MisPerros[i];
}

> me temo que debe ser por la manera en que estoy creando en TE mis 
> objetos, cuyos métodos son:
> 

No tenemos ningún problema al crear la memoria, pero sí tenemos algunos 
problemas en cuanto al diseño de la clase:

1. No inicializas los punteros miembros de la clase. Sugiero hacer lo 
siguiente:

cPatio::cPatio( float pArea )
: mArea(pArea), MisPerros(0), MisGatos(0) {}

2. Creas memoria dinámicamente, pero no la destruyes. Necesitas un 
destructor. Por ejemplo,

cPatio::~cPatio()
{
   delete[] MisPerros;
   delete[] MisGatos;
}

3. Como tienes punteros y memoria dinámica, aconsejo definir tu propio 
constructor. Esto es,

cPatio( const cPatio &ref )
{
   // Copia la información en 'ref'
   ...
}

4. Sugiero crear otras versiones de las funciones miembros de tipo 
'Get_' para manipular objetos constantes para que no sean modificados. 
Por ejemplo,

const cPerro & Get_Perro( int i ) const
{
   return MisPerros[i];
}

const cGato & Get_Gato( int i ) const
{
   return MisGatos[i];
}

Esto implica que externamente, la información no podrá ser modificada.


Espero que esto te oriente.

Steven







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