elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con sobrecarga de operador ( )
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con sobrecarga de operador ( )  (Leído 4,663 veces)
Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Duda con sobrecarga de operador ( )
« en: 15 Noviembre 2010, 09:13 am »

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
  1. ImageColor::ImageColor(const ImageColor &der) {
  2.    width=der.getWidth();
  3.    height=der.getHeight();
  4.    data = new Pixel[width*height];
  5.    for(int i=0;i<height;i++){
  6.        for(int j=0;j<width;j++){
  7.            data[coord2index(i,j)]=der(i,j);
  8.        }
  9.    }
  10. }

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

Y la implementación de la sobrecarga de dicho operador

Código
  1. Pixel& ImageColor::operator()(int row ,int col) {
  2.  return data[coord2index(row,col)];
  3. }

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


« Última modificación: 15 Noviembre 2010, 10:04 am por Akai » En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Duda con sobrecarga de operador ( )
« Respuesta #1 en: 15 Noviembre 2010, 16:56 pm »

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!




En línea

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


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Duda con sobrecarga de operador ( )
« Respuesta #2 en: 15 Noviembre 2010, 20:15 pm »

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?
« Última modificación: 15 Noviembre 2010, 21:21 pm por Akai » En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Duda con sobrecarga de operador ( )
« Respuesta #3 en: 16 Noviembre 2010, 03:53 am »

Citar
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?

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:

Citar
image.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
  1. 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
  1. Pixel& ImageColor::operator()(int row ,int col){
  2.  return data[coord2index(row,col)];
  3. }

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
  1. 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!
« Última modificación: 16 Noviembre 2010, 05:11 am por Littlehorse » En línea

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


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Duda con sobrecarga de operador ( )
« Respuesta #4 en: 16 Noviembre 2010, 07:26 am »

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.
En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Duda con sobrecarga de operador ( )
« Respuesta #5 en: 16 Noviembre 2010, 14:33 pm »

 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!


En línea

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


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Duda con sobrecarga de operador ( )
« Respuesta #6 en: 16 Noviembre 2010, 14:53 pm »

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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
sobrecarga de operador<<
Programación C/C++
adam96 5 4,576 Último mensaje 17 Diciembre 2010, 19:10 pm
por Littlehorse
Problema con la sobrecarga del operador <<
Programación C/C++
Lord_Lobotomi 2 2,436 Último mensaje 5 Diciembre 2011, 19:36 pm
por Lord_Lobotomi
Sobrecarga operador +
Programación C/C++
_Enko 4 2,658 Último mensaje 6 Febrero 2015, 14:56 pm
por _Enko
(Consulta) Sobre la sobrecarga del operador &
Programación C/C++
class_OpenGL 4 2,731 Último mensaje 31 Julio 2016, 18:39 pm
por class_OpenGL
C++ Sobrecarga de un operador por medio de un template?
Programación C/C++
GisiNA 7 5,150 Último mensaje 9 Mayo 2017, 06:18 am
por CalgaryCorpus
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines