Duda con sobrecarga de operador ( )

Iniciado por Akai, 15 Noviembre 2010, 09:13 AM

0 Miembros y 3 Visitantes están viendo este tema.

Akai

En una de las prácticas de una asignatura que curso en la facultad, estamos trabajando con un programa que convierte imágenes en formato PPM en RGB a blanco y negro ascii.

Compilando el programa, me surge el siguiente error:

-------------- Build: Debug in TaulaHashP ---------------

Compiling: image.cc
C:\Users\Akai\Facultat\2 EDA\Pràctiques\P2\TaulaHashP\image.cc: In copy constructor 'ImageColor::ImageColor(const ImageColor&)':
C:\Users\Akai\Facultat\2 EDA\Pràctiques\P2\TaulaHashP\image.cc:40: error: no match for call to '(const ImageColor) (int&, int&)'
C:\Users\Akai\Facultat\2 EDA\Pràctiques\P2\TaulaHashP\image.h:20: note: candidates are: Pixel& ImageColor::operator()(int, int) <near match>

El método que falla es el constructor de copia:

Código (cpp) [Seleccionar]
ImageColor::ImageColor(const ImageColor &der) {
   width=der.getWidth();
   height=der.getHeight();
   data = new Pixel[width*height];
   for(int i=0;i<height;i++){
       for(int j=0;j<width;j++){
           data[coord2index(i,j)]=der(i,j);
       }
   }
}


Concretamente en la linea:
Código (cpp) [Seleccionar]
data[coord2index(i,j)]=der(i,j);

Y la implementación de la sobrecarga de dicho operador

Código (cpp) [Seleccionar]
Pixel& ImageColor::operator()(int row ,int col) {
 return data[coord2index(row,col)];
}


Os dejo el código completo en pastebin:
http://pastebin.com/VSDB2hSS

¿Alguna idea de qué puede estar ocurriendo?

PD: uso code::blocks 10.05

Littlehorse

No he visto el código completo pero ten en cuenta que si tenes un miembro/objeto constante tenes que estar seguro que a lo largo de la ejecución del programa eso no va a cambiar, de lo contrario vas a tener errores de este estilo en tiempo de compilación (Precisamente una de las ventajas de utilizar o no utilizar "const" en determinados casos).

Igualmente he compilado el proyecto a ver si obtenía los mismos errores que vos, pero no :

Citar
image.cpp|42|error: passing `const ImageColor' as `this' argument of `Pixel& ImageColor::operator()(int, int)' discards qualifiers
Así que estoy casi seguro que es lo que mencione al principio. Luego cuando llegue a casa reviso el codigo con mas tiempo y cualquier cosa edito.

Saludos!


An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Akai

#2
Lo "mejor" del asunto es que la sobrecarga de dicho operador venía ya con la práctica (lo daban los profesores). Llego a pensar que el problema pueda ser del compilador.  

Edit:

He probado a compilarlo con g++ en vez de con MinGw en code::blocks (windows) y ahora si me da el mismo error que a ti. Ahora supongo que ya se trata de un error del código que he añadido yo. ¿Problema de code::blocks?

Littlehorse

#3
CitarHe probado a compilarlo con g++ en vez de con MinGw en code::blocks (windows) y ahora si me da el mismo error que a ti. Ahora supongo que ya se trata de un error del código que he añadido yo. ¿Problema de code::blocks?

Realmente lo dudo mucho pero tampoco sabría decirte ya que no utilizo MinGw.

Lo probé en Visual C++ y el error es exactamente el mismo:

Citarimage.cpp(42): error C3848: expression having type 'const ImageColor' would lose some const-volatile qualifiers in order to call 'Pixel &ImageColor::operator ()(int,int)'

Remover el const de la definición y de la declaración de la referencia utilizada "solucionaría" el problema, pero pongo las comillas debido a que si el código te fue entregado de esa manera, habría que analizar el caso para verificar si el const es necesario o no.

Edit:
Mirando un poco el código, el problema radica aquí:

Código (cpp) [Seleccionar]
ImageColor::ImageColor(const ImageColor &der)

Tenes un parámetro const, por tanto, implica que no es modificable.

Ahora bien, en la definición de la sobrecarga de operadores tenes esto:

Código (cpp) [Seleccionar]

Pixel& ImageColor::operator()(int row ,int col){
 return data[coord2index(row,col)];
}


Lo cual es lo mismo que afirmar que dicha sobrecarga podría ocasionar cierta modificación, algo que obviamente no solo no se hace en la definición si no que no se debería dado el grado de const que tiene la referencia desde cual se lo utiliza en primera instancia. Produciendo así, un error en tiempo de compilación.

La solución, seria garantizar que dicho método no va a modificar un objeto no modificable (niveles de const) declarándolo y definiendo de esta manera:

Código (cpp) [Seleccionar]
Pixel& operator()(int row , int col)const;

aunque otra solución seria simplemente no usar una referencia const en primera instancia, pero para eso habría que ver el código en mas profundidad para ver que hacen los otros métodos.

Igualmente te recomendaría que también le plantees la misma pregunta a tus profesores, ya que posiblemente no seas el único con esta duda.

Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Akai

Visto como está el problema, me parece que, como tu sugieres que haga, acudiré a preguntar a algún profesor de prácticas de la asignatura. Hasta ahora no han enviado ningún mensaje aludiendo a problemas con el código, así que imagino que mi implementación es la que ha dado problemas.

Muchísimas gracias por todo, Littlehorse.

Littlehorse

 De nada Akai!
Pensaba que los profesores te habían entregado el código completo. Igualmente mas allá de la implementación que hayas realizado, el problema principal esta en la base del código al no contemplar situaciones como las mencionadas.

Luego cuentas a ver que te dicen.

Saludos!


An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Akai

el código que entregaron fue el siguiente:
Cabecera e implementación de la estructura Pixel (.h y .cc) y la cabecera e implementación de la clase ImageColor (aunque habíamos hecho una implementación similar en una práctica anterior, pero por temas de compatibilidad con unos ejercicios de esta misma práctica preferí usar su código). El ejercicio consiste en terminar de implementar algunos operadores en base al código proporcionado.

[info extra]

En la implementación faltan métodos que son ejercicios de una parte de la práctica:implementar el constructor de copia (donde he encontrado el problema mencionado en este hilo al usar una sobrecarga del operador () ) y sobrecargar el operador ==, el operador [] (y != si mal no recuerdo).

La otra parte de la práctica tiene que ver con tablas Hash, en las que usaremos la clase ImageColor.

[/info extra]

Cuando tenga un rato  (hoy tengo el día prácticamente completo)  me pasaré a preguntar sobre el error que da. Ya comentaré al respecto.