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.
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 (cpp) [Seleccionar]
//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 (cpp) [Seleccionar]
//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 (cpp) [Seleccionar]
//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;
}