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
//Definición de la clase Array con operadores sobrecargados. #ifndef ARRAY_H #define ARRAY_H #include <iostream> using std::ostream; using std::istream; class Array { friend ostream &operator<<( ostream &, const Array & ); friend istream &operator>>( istream &, Array & ); friend Array& operator +(const Array &a1,const Array &a2); public: Array( int = 10 ); Array( const Array & ); ~Array(); int getTamanio() const; const Array &operator=( const Array & ); bool operator==( const Array & ) const; bool operator!=( const Array &derecho ) { return ! ( *this == derecho ); } int &operator[]( int ); int operator[]( int ) const; private: int tamanio; int *ptr; }; #endif
Código
//Definiciones de las funciones miembro y friend de la clase Array. #include <iostream> using std::cerr; using std::cout; using std::cin; using std::endl; #include <iomanip> using std::setw; #include <cstdlib> using std::exit; #include "Array.h" Array::Array( int tamanioArreglo ) { tamanio = ( tamanioArreglo > 0 ? tamanioArreglo : 10 ); ptr = new int[ tamanio ]; for ( int i = 0; i < tamanio; i++ ) ptr[ i ] = 0; } Array::Array( const Array &arregloACopiar ) : tamanio( arregloACopiar.tamanio ) { ptr = new int[ tamanio ]; for ( int i = 0; i < tamanio; i++ ) ptr[ i ] = arregloACopiar.ptr[ i ]; } Array::~Array() { delete [] ptr; } int Array::getTamanio() const { return tamanio; } const Array &Array::operator=( const Array &derecho ) { if ( &derecho != this ) { 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 { delete [] ptr; tamanio = derecho.tamanio; ptr = new int[ tamanio ]; } for ( int i = 0; i < tamanio; i++ ) ptr[ i ] = derecho.ptr[ i ]; } return *this; } bool Array::operator==( const Array &derecho ) const { if ( tamanio != derecho.tamanio ) return false; for ( int i = 0; i < tamanio; i++ ) if ( ptr[ i ] != derecho.ptr[ i ] ) return false; return true; } int &Array::operator[]( int subindice ) { if ( subindice < 0 || subindice >= tamanio ) { cerr << "\nError: subindice " << subindice << " fuera de rango" << endl; exit( 1 ); } return ptr[ subindice ]; } int Array::operator[]( int subindice ) const { if ( subindice < 0 || subindice >= tamanio ) { cerr << "\nError: subindice " << subindice << " fuera de rango" << endl; exit( 1 ); } return ptr[ subindice ]; } istream &operator>>( istream &entrada, Array &a ) { for ( int i = 0; i < a.tamanio; i++ ) entrada >> a.ptr[ i ]; return entrada; } ostream &operator<<( ostream &salida, const Array &a ) { int i; for ( int i = 0; i < a.tamanio; i++ ) { salida << setw( 12 ) << a.ptr[ i ]; if ( ( i + 1 ) % 4 == 0 ) salida << endl; } if ( i % 4 != 0 ) salida << endl; return salida; } Array& operator +(const Array &a1,const Array &a2) { Array b; for ( int i = 0; i < b.tamanio; i++ ) { b.ptr[i] = a1.ptr[i] + a2.ptr[i]; } return b; }
Código
//Programa de prueba de la clase Array. #include <iostream> using std::cout; using std::cin; using std::endl; #include "Array.h" int main() { Array enteros1( 5 ); //Estos numeros se modifican como quieras pero al final deben ser iguales para poder realizar la suma Array enteros2(5); cout << "El tamanio del objeto Array enteros1 es " << enteros1.getTamanio() << "\nEl objeto Array despues de la inicializacion es:\n" << enteros1; cout << "\nEl tamanio del objeto Array enteros2 es " << enteros2.getTamanio() << "\nEl objeto Array despues de la inicializacion es:\n" << enteros2; cout << "\nIntroduzca 17 enteros:" << endl; cin >> enteros1 >> enteros2; cout << "\nDespues de la entrada, los objetos Array contienen:\n" << "enteros1:\n" << enteros1 << "enteros2:\n" << enteros2; cout << "\nEvaluando: enteros1 != enteros2" << endl; if ( enteros1 != enteros2 ) cout << "enteros1 y enteros2 no son iguales" << endl; Array enteros3( enteros1 ); cout << "\nEl tamanio del objeto Array enteros3 es " << enteros3.getTamanio() << "\nEl objeto Array despues de la inicializacion es:\n" << enteros3; cout << "\nAsignando enteros2 a enteros1:" << endl; enteros1 = enteros2; cout << "enteros1:\n" << enteros1 << "enteros2:\n" << enteros2; Array enteros4(5); cout << enteros4.getTamanio(); enteros4 = enteros1 + enteros2; // El error debe estar aquí cout << "enteros4:\n" << enteros4; cout << "\nEvaluando: enteros1 == enteros2" << endl; if ( enteros1 == enteros2 ) cout << "enteros1 y enteros2 son iguales" << endl; cout << "\nenteros1[5 es " << enteros1[ 5 ]; cout << "\n\nAsignando 1000 a enteros1[5]" << endl; enteros1[ 5 ] = 1000; cout << "enteros1:\n" << enteros1; cout << "\nTrata de asignar 1000 a enteros1[15]" << endl; enteros1[ 15 ] = 1000; return 0; }