Ver Mensaje Individual
  #6 (permalink)  
Antiguo 09/07/2007, 22:13
Avatar de Instru
Instru
 
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años
Puntos: 52
Re: Doble sobrecarga de operadores en C++

Cita:
Iniciado por fightmx Ver Mensaje
Pues puedes hacerlo sin retornar la referencia al objeto aunque perderias algunos casos, y como no has especificado si "objetoX[123]" es tambien un objeto de la clase X supondré que si.

Entonces pudieras tener algo del estilo:

Código:
ClaseX ClaseX::operator=(tipoY y)
{
       //asignaciones aquí...
       return *this;
}
Y es claramente valido para:
Código:
objetoX[123] = valorY;
/*** que viene siendo ***/
// objetoX[123].operator=(valorY);
Pero por ejemplo, aunque la siguiente expresión es válida, no lo será para nuestra definición del operador "=":
Código:
(objetoX[123] = valorY) = valorZ;
/*** que viene siendo ***/
// (objetoX[123].operator=(valorY)).operator=(valorZ);
Aquí tenemos el caso en donde un objeto retornado por la funcion operator=()
es usado para llamar una vez mas a la función operator=(), y si solo estamos retornando el objeto ClaseX esta mal porque estamos retornando una copia temporal del objeto original y no se permite invocar funciones miembro desde objetos temporales, es por esto que es necesario no solo retornar una copia del objeto modificado sino una referencia para abarcar los casos a detalle cuando sobrecargamos el operador de asignación. En otras palabras el valor de retorno cuando el tipo de retorno es solo ClaseX no es un lvalue.

En fin es solo eso, para abarcar todos los posibles casos y darle un soporte de uso normal al operador de asignacion dentro de C++, mas no es obligatorio retornar la referencia.

Saludos Instru.
Muchisimas gracias por tu informanio, solo que si me quedo una duda:

Cita:
ClaseX ClaseX::operator=(tipoY y)
{
//asignaciones aquí...
return *this;
}
El objetoX no es un array de objetosX, en realidad es solo un objeto con el operador de indexacion sobrecargado. Dentro de la clase del objeto hay un array, al cual quiero accesar de esta manera, como un array. Entonces, al devolver el puntero this estas devolviendo un elemento de un array de objetosX lo cual no es.
No se si me explico.

Tengo el operador de indexacion sobrecargado para poder hacer esto:

indice=cualquier_numero;
variable=objeto[indice];

Ahora quiero que tambien se pueda hacer al revez:

objeto[indice]=valor;

Donde valor es una variable de tipo byte(unsigned char) y va a ser copiada a una localidad de un arreglo interno dentro de la clase.
Es decir, como si el arreglo estuviera afuera, pero con la clase tener el control de los datos de entrada y de salida.

_Lucifer_, espero que con esto hayas visto porque las referencias no me sirven.

Saludos