[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