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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  tengo un problema con este programa en c++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: tengo un problema con este programa en c++  (Leído 1,593 veces)
mikael2018

Desconectado Desconectado

Mensajes: 1


Ver Perfil
tengo un problema con este programa en c++
« en: 29 Octubre 2014, 03:25 am »

estoy viendo polimorfismo y me están enseñando sobrecarga de operadores pero me he atorado tengo que realizar una clase que calcule fracciones sume reste divida con sobre carga de operadores pero una vez que las inicie ya no se que mas sigue si me pueden ayudar

Código
  1. class prueba
  2. { public:
  3. double a, b;
  4. prueba(const double a,const double b)
  5. { this->a = a;
  6. this->b = b;
  7. }
  8. };
  9.  
  10. // Sobrecarga del operador +
  11. prueba& operator +( const prueba &p1, const prueba &p2)
  12. { return *(new prueba(p1.a + p2.a, p1.b + p2.b) );
  13. }
  14.  
  15. prueba& operator-( const prueba &p3, const prueba &p4)
  16. { return *(new prueba(p3.a - p4.a, p3.b - p4.b) );
  17. }
  18.  
  19.  
  20. prueba& operator *( const prueba &p5, const prueba &p6)
  21. { return *(new prueba(p5.a * p6.a, p5.b * p6.b) );
  22. }
  23.  
  24.  
  25. prueba& operator /( const prueba &p7, const prueba &p8)
  26. { return *(new prueba(p7.a / p8.a, p7.b / p8.b) );
  27. }
  28.  
  29.  
  30.  
  31.  
  32. int main()
  33. {
  34.  
  35.  
  36. system("PAUSE");
  37. }
  38.  


[MOD] Para publicar codigo, usa las etiquetas "GeSHi"


« Última modificación: 29 Octubre 2014, 03:36 am por simorg » En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: tengo un problema con este programa en c++
« Respuesta #1 en: 29 Octubre 2014, 15:35 pm »

1. Lagunas de memoria

Código
  1. return *(new prueba(p1.a + p2.a, p1.b + p2.b) );

Fíjate que estás reservando memoria dinámica con el new. En esta reserva pones un objeto que almacena el resultado de sumar p1 y p2. Después haces una copia de dicho objeto y retornas dicha copia... pero no has liberado la memoria que has reservado, por lo que estás creando lagunas de memoria.

Si en un método devuelves un objeto por valor, ese método no debe hacer uso de un "new" para almacenar el objeto que vas a retornar porque entonces tendrás problemas con la memoria. Dicho con pocas palabras, el "new" sobra:

Código
  1. return prueba(p1.a + p2.a, p1.b + p2.b);

2. Retorno de referencias

Código
  1. prueba& operator +( const prueba &p1, const prueba &p2)
  2. {
  3.  return prueba(p1.a + p2.a, p1.b + p2.b);
  4. }

Partimos del operador una vez aplicada la corrección anterior porque no tiene sentido ir dejando lagunas de memoria. El problema ahora es que el objeto "prueba" que estamos creando dentro del operador se elimina automáticamente cuando la ejecución abandona el método. Resulta que estamos devolviendo una referencia, luego estaremos devolviendo una referencia a un objeto que no existe. El compilador seguramente te avise de esta circunstancia con, al menos, un warning.

Este método no puede devolver una referencia.

Código
  1. prueba operator +( const prueba &p1, const prueba &p2)
  2. {
  3.  return prueba(p1.a + p2.a, p1.b + p2.b);
  4. }

3. Nombres de variables

Código
  1. prueba operator+( const prueba &p1, const prueba &p2);
  2. prueba operator-( const prueba &p3, const prueba &p4);
  3. prueba operator*( const prueba &p5, const prueba &p6);
  4. prueba operator/( const prueba &p7, const prueba &p8);

La variable "p1" que usa como argumento el operador de suma únicamente va a existir dentro de dicha función. Fuera del operador suma la variable "p1" no existe, y cualquier intento por acceder a ella provocará un error al compilar. Por este motivo no hay ningún problema si repites los nombres en los diferentes métodos:

Código
  1. prueba operator+( const prueba &p1, const prueba &p2);
  2. prueba operator-( const prueba &p1, const prueba &p2);
  3. prueba operator*( const prueba &p1, const prueba &p2);
  4. prueba operator/( const prueba &p1, const prueba &p2);

Puede parecer un cambio meramente estético, pero como pretendas escribir un programa completo sin repetir el nombre de ninguna variable, incluso si el nombre únicamente se usa en un ámbito muy reducido, puedes acabar con un dolor de cabeza muy serio.

4. Uso de los operadores

Ya has definido los operadores... ahora solo te queda usarlos. Crea varios elementos con diferentes valores y haz uso de los diferentes operadores. Después saca por pantalla los resultados y verifica que el resultado obtenido coincide con el esperado:

Código
  1. int main( )
  2. {
  3.  prueba p1( 10, 20 );
  4.  prueba p2( 4.67, 2.44 );
  5.  
  6.  prueba resultado = p1 + p2;
  7.  
  8.  std::cout << "a=" << resultado.a << std::endl;
  9.  std::cout << "b=" << resultado.b << std::endl;
  10. }


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines