Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Error con conversion de tipos/c++

Estas en el tema de Error con conversion de tipos/c++ en el foro de C/C++ en Foros del Web. Hola, como estan? bueno, paso a dejarles un problema que tengo con un codigo de un libro que transcribi al compilador. Me tira dos errores ...
  #1 (permalink)  
Antiguo 09/05/2014, 14:33
 
Fecha de Ingreso: octubre-2011
Mensajes: 17
Antigüedad: 13 años, 1 mes
Puntos: 0
Exclamación Error con conversion de tipos/c++

Hola, como estan? bueno, paso a dejarles un problema que tengo con un codigo de un libro que transcribi al compilador. Me tira dos errores en la funcion de conversion 'operator inventario2()' y no lo puedo solucionar. El tema es que cuando saco esa funcion el programa me funciona sin problemas porque se ve que utiliza 'inventario2(inventario1 p)'...supongo que me esta generando un conflicto porque no puede invocar a la funcion y al constructor a la vez. Pero cuando saco el constructor para usar la funcion me vuelve a tirar error, mi pregunta es ¿Como hago para usar solo la funcion de conversion sin que me tire estos errores? (sin modificar todo el codigo claro). A continuacion les paso el codigo para que vean:

#include <iostream>
using namespace std;

class inventario2; //Clase destino creada

class inventario1 { //Clase fuente
int codigo; //Codigo de unidad
int unidades; //Numero de unidades
float precio; //Coste de cada unidad
public:
inventario1(int a, int b, float c) {
codigo = a;
unidades = b;
precio = c;
}
void putdatos() {
cout<<" Codigo = "<<codigo<<"\n";
cout<<" Unidades = "<<unidades<<"\n";
cout<<" Precio = "<<precio<<"\n";
}
int getcodigo() {
return codigo;
}
int getunidades() {
return unidades;
}
float getprecio() {
return precio;
}
operator float() {
return (unidades * precio);
}
operator inventario2() {
inventario2 temp;
temp.codigo = codigo;
temp.valor = precio * unidades;
return temp;
}
}; //Fin de la clase fuente
class inventario2 {
int codigo;
float valor;
public:
inventario2() {
codigo = 0;
valor = 0;
}
inventario2(int x, float y) { //Constructor
codigo = x; //para inicializacion
valor = y;
}
void putdatos() {
cout<<" Codigo = "<<codigo<<"\n";
cout<<" Valor = "<<valor<<"\n";
}
inventario2(inventario1 p) { //Constructor para conversion
codigo = p.getcodigo();
valor = p.getunidades() * p.getprecio();
}
}; //Fin de la clase destino

int main(int argc, char *argv[]) {
inventario1 s1(100, 5, 140.0);
inventario2 s2;
float valor_total;

/* inventario1 a float */
valor_total = s1;
/* inventario1 a inventario2 */
s2 = s1;

cout<<" Detalles de productos - inventario tipo 1 "<<"\n";
s1.putdatos();

cout<<"\n Valor del almacen "<<"\n";
cout<<" Valor = "<<valor_total<<"\n\n";

cout<<" Detalles de productos - inventario tipo 2 "<<"\n";
s2.putdatos();

return 0;
}
  #2 (permalink)  
Antiguo 09/05/2014, 15:05
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Error con conversion de tipos/c++

Sugiero aprendas a usar Highlight
El codigo queda asi:
Código C++:
Ver original
  1. int main() {
  2.    cout << "Hello world"; // bla bla
  3.    return 0;
  4. }

Con colores, numero de linea, etc.
El mismo codigo queda asi sin highlight
int main() {
cout << "Hello world"; // bla bla
return 0;
}

Si quiero decir cual es el error, podria indicarte el nro de linea. Creo que esperaré a que aprendas a usar Highlight.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 09/05/2014, 17:06
 
Fecha de Ingreso: octubre-2011
Mensajes: 17
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Error con conversion de tipos/c++

Hola, no entendi la idea de esa parte de codigo que pusiste y como bien decis no se usar Highlight.
Me gustaria saber si hay alguna otra solucion para este problema que tengo.
De todas formas gracias por responder. Un abrazo, Calgary
  #4 (permalink)  
Antiguo 09/05/2014, 20:20
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Error con conversion de tipos/c++

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class inventario2; //Clase destino creada
  5.  
  6. class inventario1 { //Clase fuente
  7.         int codigo; //Codigo de unidad
  8.         int unidades; //Numero de unidades
  9.         float precio; //Coste de cada unidad
  10.     public:
  11.         inventario1 ( int a, int b, float c ) {
  12.             codigo = a;
  13.             unidades = b;
  14.             precio = c;
  15.         }
  16.         void putdatos() {
  17.             cout << " Codigo = " << codigo << "\n";
  18.             cout << " Unidades = " << unidades << "\n";
  19.             cout << " Precio = " << precio << "\n";
  20.         }
  21.         int getcodigo() {
  22.             return codigo;
  23.         }
  24.         int getunidades() {
  25.             return unidades;
  26.         }
  27.         float getprecio() {
  28.             return precio;
  29.         }
  30.         operator float() {
  31.             return ( unidades * precio );
  32.         }
  33.         operator inventario2() {
  34.             inventario2 temp;
  35.             temp.codigo = codigo;
  36.             temp.valor = precio * unidades;
  37.             return temp;
  38.         }
  39. }; //Fin de la clase fuente
  40. class inventario2 {
  41.         int codigo;
  42.         float valor;
  43.     public:
  44.         inventario2() {
  45.             codigo = 0;
  46.             valor = 0;
  47.         }
  48.         inventario2 ( int x, float y ) { //Constructor
  49.             codigo = x; //para inicializacion
  50.             valor = y;
  51.         }
  52.         void putdatos() {
  53.             cout << " Codigo = " << codigo << "\n";
  54.             cout << " Valor = " << valor << "\n";
  55.         }
  56.         inventario2 ( inventario1 p ) { //Constructor para conversion
  57.             codigo = p.getcodigo();
  58.             valor = p.getunidades() * p.getprecio();
  59.         }
  60. }; //Fin de la clase destino
  61.  
  62. int main ( int argc, char * argv[] ) {
  63.     inventario1 s1 ( 100, 5, 140.0 );
  64.     inventario2 s2;
  65.     float valor_total;
  66.    
  67.     /* inventario1 a float */
  68.     valor_total = s1;
  69.     /* inventario1 a inventario2 */
  70.     s2 = s1;
  71.    
  72.     cout << " Detalles de productos - inventario tipo 1 " << "\n";
  73.     s1.putdatos();
  74.    
  75.     cout << "\n Valor del almacen " << "\n";
  76.     cout << " Valor = " << valor_total << "\n\n";
  77.    
  78.     cout << " Detalles de productos - inventario tipo 2 " << "\n";
  79.     s2.putdatos();
  80.    
  81.     return 0;
  82. }

Te lo arreglo para que vean.
  #5 (permalink)  
Antiguo 09/05/2014, 20:45
 
Fecha de Ingreso: octubre-2011
Mensajes: 17
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Error con conversion de tipos/c++

Cita:
Iniciado por vangodp Ver Mensaje
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class inventario2; //Clase destino creada
  5.  
  6. class inventario1 { //Clase fuente
  7.         int codigo; //Codigo de unidad
  8.         int unidades; //Numero de unidades
  9.         float precio; //Coste de cada unidad
  10.     public:
  11.         inventario1 ( int a, int b, float c ) {
  12.             codigo = a;
  13.             unidades = b;
  14.             precio = c;
  15.         }
  16.         void putdatos() {
  17.             cout << " Codigo = " << codigo << "\n";
  18.             cout << " Unidades = " << unidades << "\n";
  19.             cout << " Precio = " << precio << "\n";
  20.         }
  21.         int getcodigo() {
  22.             return codigo;
  23.         }
  24.         int getunidades() {
  25.             return unidades;
  26.         }
  27.         float getprecio() {
  28.             return precio;
  29.         }
  30.         operator float() {
  31.             return ( unidades * precio );
  32.         }
  33.         operator inventario2() {
  34.             inventario2 temp;
  35.             temp.codigo = codigo;
  36.             temp.valor = precio * unidades;
  37.             return temp;
  38.         }
  39. }; //Fin de la clase fuente
  40. class inventario2 {
  41.         int codigo;
  42.         float valor;
  43.     public:
  44.         inventario2() {
  45.             codigo = 0;
  46.             valor = 0;
  47.         }
  48.         inventario2 ( int x, float y ) { //Constructor
  49.             codigo = x; //para inicializacion
  50.             valor = y;
  51.         }
  52.         void putdatos() {
  53.             cout << " Codigo = " << codigo << "\n";
  54.             cout << " Valor = " << valor << "\n";
  55.         }
  56.         inventario2 ( inventario1 p ) { //Constructor para conversion
  57.             codigo = p.getcodigo();
  58.             valor = p.getunidades() * p.getprecio();
  59.         }
  60. }; //Fin de la clase destino
  61.  
  62. int main ( int argc, char * argv[] ) {
  63.     inventario1 s1 ( 100, 5, 140.0 );
  64.     inventario2 s2;
  65.     float valor_total;
  66.    
  67.     /* inventario1 a float */
  68.     valor_total = s1;
  69.     /* inventario1 a inventario2 */
  70.     s2 = s1;
  71.    
  72.     cout << " Detalles de productos - inventario tipo 1 " << "\n";
  73.     s1.putdatos();
  74.    
  75.     cout << "\n Valor del almacen " << "\n";
  76.     cout << " Valor = " << valor_total << "\n\n";
  77.    
  78.     cout << " Detalles de productos - inventario tipo 2 " << "\n";
  79.     s2.putdatos();
  80.    
  81.     return 0;
  82. }

Te lo arreglo para que vean.
Perdon la desprolijidad, es la segunda vez que posteo un tema de debate y no sabia hacer eso. De paso te agradezco la arreglada jaja. Saludos y espero que ahora entiendan mejor para ayudarme con mi problema
  #6 (permalink)  
Antiguo 09/05/2014, 21:18
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Error con conversion de tipos/c++

He intentado encontrar el problema pero como no entiendo muy bien los operator no logro identificar el problema. A ver si pronto te echan una mano. Seguro que si ;)
  #7 (permalink)  
Antiguo 10/05/2014, 04:44
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Error con conversion de tipos/c++

En C++ no es posible instanciar tipos que el compilador no ha visto completamente. Tu operator intenta hacer esto (linea 34) y el compilador, perplejo, no lo acepta y reclama.

En terminos generales, en C++ está permitida la conversión HACIA otros tipos usando operator o bien la conversion DESDE otro tipo mediante el constructor. Al incluir ambos estas haciendo competir las conversiones. Si pudieras compilar ambos, un compilador hábil lo mas probable es que te diga que hay ambiguedad en algunos casos. En otro resolverá por el uso que le das (por ejemplo si lo usas en contextos en donde se generan variables temporales).

Es mejor la conversion DESDE otro tipo, usando el contructor.. Construir un objeto de otra clase tiene el problema que cada cambio en la segunda clase hay que traerla a la primera, o sea hay que modificar 2 veces todo.
La conversion DESDE otra clase podria no tener este costo si construyo mi objeto usando metodos publicos de la otra clase. Mientras la otra clase no cambie su interfaz hacia afuera, no habra el costo de modificar otras clases al modificar esta.

En este codigo sugiero que remuevas el operator..
__________________
Visita mi perfil en LinkedIn

Última edición por CalgaryCorpus; 10/05/2014 a las 09:00
  #8 (permalink)  
Antiguo 10/05/2014, 15:54
 
Fecha de Ingreso: octubre-2011
Mensajes: 17
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Error con conversion de tipos/c++

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
En C++ no es posible instanciar tipos que el compilador no ha visto completamente. Tu operator intenta hacer esto (linea 34) y el compilador, perplejo, no lo acepta y reclama.

En terminos generales, en C++ está permitida la conversión HACIA otros tipos usando operator o bien la conversion DESDE otro tipo mediante el constructor. Al incluir ambos estas haciendo competir las conversiones. Si pudieras compilar ambos, un compilador hábil lo mas probable es que te diga que hay ambiguedad en algunos casos. En otro resolverá por el uso que le das (por ejemplo si lo usas en contextos en donde se generan variables temporales).

Es mejor la conversion DESDE otro tipo, usando el contructor.. Construir un objeto de otra clase tiene el problema que cada cambio en la segunda clase hay que traerla a la primera, o sea hay que modificar 2 veces todo.
La conversion DESDE otra clase podria no tener este costo si construyo mi objeto usando metodos publicos de la otra clase. Mientras la otra clase no cambie su interfaz hacia afuera, no habra el costo de modificar otras clases al modificar esta.

En este codigo sugiero que remuevas el operator..
Buenas. Si, lo que vos me estas diciendo es que me conviene usar el contructor y evitar la funcion operator, que es lo que hice yo y, como bien decis, asi me funciono correctamente. Ahora, este problema si lo quisiera hacer con la funcion operator me estas diciendo que se me haria mas complicado?, me gustaria saber como deberia ser el codigo usando solo la funcion operator (si es que se puede hacer) me quedo esa intriga jaja. Muchas gracias por tu respuesta, saludos!
  #9 (permalink)  
Antiguo 10/05/2014, 16:16
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Error con conversion de tipos/c++

Remueve el constructor de inventario2 que recibe un inventario1 y escribe primero la clase inventario2 y luego inventario1. No lo he testeado, pero creo que eso permitiria que el compilador acepte el operator tal como lo has definido.

Todavia recomiendo quedarse con el constructor, no con el operator. Las razones en mi post anterior.
__________________
Visita mi perfil en LinkedIn
  #10 (permalink)  
Antiguo 10/05/2014, 18:49
 
Fecha de Ingreso: octubre-2011
Mensajes: 17
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Error con conversion de tipos/c++

Cita:
Iniciado por CalgaryCorpus Ver Mensaje
Remueve el constructor de inventario2 que recibe un inventario1 y escribe primero la clase inventario2 y luego inventario1. No lo he testeado, pero creo que eso permitiria que el compilador acepte el operator tal como lo has definido.

Todavia recomiendo quedarse con el constructor, no con el operator. Las razones en mi post anterior.
Gracias, mi duda era mas que nada porque no queria quedarme sin saber por que no me funcionaba la funcion operator y efectivamente funciono con esa modificacion que me dijiste. Pero si, yo tambien prefiero usar el constructor. Saludos y gracias de nuevo por la solucion

Etiquetas: conversion, funcion, int, numero, programa, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:27.