Cita: Ya habia visto que se puede hacer con referencias, de hecho en el tutorial de C con clases viene tambien muy bien explicado, pero lo que no quiero es eso, referencias. Quiero que sea por valor.
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.