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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / [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. }
2  Programación / Programación C/C++ / [C++] Participar en proyectos en: 15 Enero 2014, 14:28 pm
Buenas a todos, hace poco que me he leído un libro para aprender a programar y más o menos me he enterado de lo que decía, el problema es que no he hecho ejercicios por mi cuenta, y estoy verde a la hora de programar en C++. Me gustaría participar en algún proyecto de C++ si puede ser en consola para poner en práctica los conocimientos básicos del lenguaje.

¿Conocéis algún proyecto en marcha? O alguna web de proyectos (si está en inglés no pasa nada, más o menos me defiendo en el idioma). También he estado viendo Allegro y Qt, pero solo viéndolo ya que no tengo ni idea.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines