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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C++] Sobrecarga de Operadores
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C++] Sobrecarga de Operadores  (Leído 3,242 veces)
Suji

Desconectado Desconectado

Mensajes: 6


Ver Perfil
[C++] Sobrecarga de Operadores
« en: 17 Septiembre 2016, 13:52 pm »

Buenas estoy aprendiendo a sobrecargar operadores y estoy haciendo un ejercicio de un libro, el ejercicio funciona bien, pero le he añadido por mi cuenta una sobrecarga adicional, el operador +.

El problema que tengo es que me compila y me genera el programa correctamente pero se estropea cuando llega a mi sobrecarga. Según el debugger podría deberse a la sobrecarga del operador de asignación, pero no logro hacer funcionar esta parte:

enteros4 = enteros1 + enteros2;

¿Podriais decirme qué estoy haciendo mal y qué debería hacer para sobrecargar correctamente el Array?

Tened en cuenta que estoy aprendiendo, gracias de antemano.

Código
  1. //Definición de la clase Array con operadores sobrecargados.
  2.  
  3. #ifndef ARRAY_H
  4. #define ARRAY_H
  5.  
  6. #include <iostream>
  7. using std::ostream;
  8. using std::istream;
  9.  
  10. class Array
  11. {
  12. friend ostream &operator<<( ostream &, const Array & );
  13. friend istream &operator>>( istream &, Array & );
  14. friend Array& operator +(const Array &a1,const Array &a2);
  15. public:
  16. Array( int = 10 );
  17. Array( const Array & );
  18. ~Array();
  19. int getTamanio() const;
  20.  
  21. const Array &operator=( const Array & );
  22. bool operator==( const Array & ) const;
  23. bool operator!=( const Array &derecho )
  24. {
  25. return ! ( *this == derecho );
  26. }
  27.  
  28. int &operator[]( int );
  29.  
  30. int operator[]( int ) const;
  31. private:
  32. int tamanio;
  33. int *ptr;
  34. };
  35.  
  36. #endif
  37.  

Código
  1. //Definiciones de las funciones miembro y friend de la clase Array.
  2.  
  3. #include <iostream>
  4. using std::cerr;
  5. using std::cout;
  6. using std::cin;
  7. using std::endl;
  8.  
  9. #include <iomanip>
  10. using std::setw;
  11.  
  12. #include <cstdlib>
  13. using std::exit;
  14.  
  15. #include "Array.h"
  16.  
  17. Array::Array( int tamanioArreglo )
  18. {
  19. tamanio = ( tamanioArreglo > 0 ? tamanioArreglo : 10 );
  20. ptr = new int[ tamanio ];
  21.  
  22. for ( int i = 0; i < tamanio; i++ )
  23. ptr[ i ] = 0;
  24. }
  25.  
  26. Array::Array( const Array &arregloACopiar )
  27. : tamanio( arregloACopiar.tamanio )
  28. {
  29. ptr = new int[ tamanio ];
  30.  
  31. for ( int i = 0; i < tamanio; i++ )
  32. ptr[ i ] = arregloACopiar.ptr[ i ];
  33. }
  34.  
  35. Array::~Array()
  36. {
  37. delete [] ptr;
  38. }
  39.  
  40. int Array::getTamanio() const
  41. {
  42. return tamanio;
  43. }
  44.  
  45. const Array &Array::operator=( const Array &derecho )
  46. {
  47. if ( &derecho != this )
  48. {
  49. if ( tamanio != derecho.tamanio ) //Supuestamente el error está aquí según el debugger me dice: Array::operator=(this=0x7fffffffe350, derecho=...) 0x400db8 y después me dice main() 0x4014f4
  50. {
  51. delete [] ptr;
  52. tamanio = derecho.tamanio;
  53. ptr = new int[ tamanio ];
  54. }
  55.  
  56. for ( int i = 0; i < tamanio; i++ )
  57. ptr[ i ] = derecho.ptr[ i ];
  58. }
  59.  
  60. return *this;
  61. }
  62.  
  63. bool Array::operator==( const Array &derecho ) const
  64. {
  65. if ( tamanio != derecho.tamanio )
  66. return false;
  67.  
  68. for ( int i = 0; i < tamanio; i++ )
  69. if ( ptr[ i ] != derecho.ptr[ i ] )
  70. return false;
  71.  
  72. return true;
  73. }
  74.  
  75. int &Array::operator[]( int subindice )
  76. {
  77. if ( subindice < 0 || subindice >= tamanio )
  78. {
  79. cerr << "\nError: subindice " << subindice
  80. << " fuera de rango" << endl;
  81. exit( 1 );
  82. }
  83.  
  84. return ptr[ subindice ];
  85. }
  86.  
  87. int Array::operator[]( int subindice ) const
  88. {
  89. if ( subindice < 0 || subindice >= tamanio )
  90. {
  91. cerr << "\nError: subindice " << subindice
  92. << " fuera de rango" << endl;
  93. exit( 1 );
  94. }
  95.  
  96. return ptr[ subindice ];
  97. }
  98.  
  99. istream &operator>>( istream &entrada, Array &a )
  100. {
  101. for ( int i = 0; i < a.tamanio; i++ )
  102. entrada >> a.ptr[ i ];
  103.  
  104. return entrada;
  105. }
  106.  
  107. ostream &operator<<( ostream &salida, const Array &a )
  108. {
  109. int i;
  110.  
  111. for ( int i = 0; i < a.tamanio; i++ )
  112. {
  113. salida << setw( 12 ) << a.ptr[ i ];
  114.  
  115. if ( ( i + 1 ) % 4 == 0 )
  116. salida << endl;
  117. }
  118.  
  119. if ( i % 4 != 0 )
  120. salida << endl;
  121.  
  122. return salida;
  123. }
  124.  
  125. Array& operator +(const Array &a1,const Array &a2)
  126. {
  127.    Array b;
  128.  
  129.    for ( int i = 0; i < b.tamanio; i++ )
  130.    {
  131.    b.ptr[i] = a1.ptr[i] + a2.ptr[i];
  132.    }
  133.  
  134.    return b;
  135. }

Código
  1. //Programa de prueba de la clase Array.
  2.  
  3. #include <iostream>
  4. using std::cout;
  5. using std::cin;
  6. using std::endl;
  7.  
  8. #include "Array.h"
  9.  
  10. int main()
  11. {
  12. Array enteros1( 5 ); //Estos numeros se modifican como quieras pero al final deben ser iguales para poder realizar la suma
  13. Array enteros2(5);
  14.  
  15. cout << "El tamanio del objeto Array enteros1 es "
  16. << enteros1.getTamanio()
  17. << "\nEl objeto Array despues de la inicializacion es:\n" << enteros1;
  18.  
  19. cout << "\nEl tamanio del objeto Array enteros2 es "
  20. << enteros2.getTamanio()
  21. << "\nEl objeto Array despues de la inicializacion es:\n" << enteros2;
  22.  
  23. cout << "\nIntroduzca 17 enteros:" << endl;
  24. cin >> enteros1 >> enteros2;
  25.  
  26. cout << "\nDespues de la entrada, los objetos Array contienen:\n"
  27. << "enteros1:\n" << enteros1
  28. << "enteros2:\n" << enteros2;
  29.  
  30. cout << "\nEvaluando: enteros1 != enteros2" << endl;
  31.  
  32. if ( enteros1 != enteros2 )
  33. cout << "enteros1 y enteros2 no son iguales" << endl;
  34.  
  35. Array enteros3( enteros1 );
  36.  
  37. cout << "\nEl tamanio del objeto Array enteros3 es "
  38. << enteros3.getTamanio()
  39. << "\nEl objeto Array despues de la inicializacion es:\n" << enteros3;
  40.  
  41. cout << "\nAsignando enteros2 a enteros1:" << endl;
  42. enteros1 = enteros2;
  43.  
  44.  
  45.  
  46. cout << "enteros1:\n" << enteros1
  47. << "enteros2:\n" << enteros2;
  48.  
  49.    Array enteros4(5);
  50.  
  51.    cout << enteros4.getTamanio();
  52.  
  53. enteros4 = enteros1 + enteros2; // El error debe estar aquí
  54.  
  55. cout << "enteros4:\n" << enteros4;
  56.  
  57. cout << "\nEvaluando: enteros1 == enteros2" << endl;
  58.  
  59. if ( enteros1 == enteros2 )
  60. cout << "enteros1 y enteros2 son iguales" << endl;
  61.  
  62. cout << "\nenteros1[5 es " << enteros1[ 5 ];
  63.  
  64. cout << "\n\nAsignando 1000 a enteros1[5]" << endl;
  65. enteros1[ 5 ] = 1000;
  66. cout << "enteros1:\n" << enteros1;
  67.  
  68. cout << "\nTrata de asignar 1000 a enteros1[15]" << endl;
  69. enteros1[ 15 ] = 1000;
  70.  
  71. return 0;
  72. }


En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C++] Sobrecarga de Operadores
« Respuesta #1 en: 17 Septiembre 2016, 16:19 pm »

Cuando sea así, dí qué error tienes. El error que te da el compilador.

El operador + está como privado. Prueba poniendolo como public.


En línea

Suji

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: [C++] Sobrecarga de Operadores
« Respuesta #2 en: 17 Septiembre 2016, 16:54 pm »

Vale, me da el siguiente error:

Severity   Code   Description   Project   File   Line   Suppression State
Warning   C4172   returning address of local variable or temporary: b (línea 134)

Creo que el problema es que estoy creando un objeto dentro de la función operator y no sé por qué pero no me deja.
 
En línea

Suji

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: [C++] Sobrecarga de Operadores
« Respuesta #3 en: 17 Septiembre 2016, 17:20 pm »

Vale ya lo he solucionado, al parecer habría que borrar el último trozo de código del main para que compilara bien. Se ha solucionado así xD. Muchas gracias.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: [C++] Sobrecarga de Operadores
« Respuesta #4 en: 17 Septiembre 2016, 23:04 pm »

Cuidado con eso. El problema era:
Código
  1. Array& operator +(const Array &a1,const Array &a2)
  2. {
  3.    Array b;
  4.  
  5.    for ( int i = 0; i < b.tamanio; i++ )
  6.    {
  7.    b.ptr[i] = a1.ptr[i] + a2.ptr[i];
  8.    }
  9.  
  10.    return b;
  11. }

El retorno es Array&. Es decir, una referencia a un objeto. Estás retornando un objeto del ámbito de la función, es decir, va a desaparecer terminada la función. Estás retornando una referencia a un objeto que será destruido.
La solución, es poner que retorne un Array, sin el operador &.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Duda] Sobrecarga de operadores
Programación C/C++
BlackZeroX 4 2,989 Último mensaje 13 Junio 2011, 20:55 pm
por BlackZeroX
C++ - Sobrecarga de operadores
Programación C/C++
eltongabinghiman 2 2,907 Último mensaje 14 Marzo 2012, 18:14 pm
por x64core
problema con sobrecarga de operadores c++
Programación C/C++
swagger14 1 2,445 Último mensaje 4 Abril 2012, 22:26 pm
por david_BS
Sobrecarga de operadores en C#
.NET (C#, VB.NET, ASP)
DanielPy 3 3,717 Último mensaje 31 Julio 2013, 19:22 pm
por Novlucker
Duda [Sobrecarga de operadores]
Programación C/C++
Abril7 1 1,670 Último mensaje 22 Noviembre 2016, 22:40 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines