[C++] Sobrecarga de Operadores

Iniciado por Suji, 17 Septiembre 2016, 13:52 PM

0 Miembros y 1 Visitante están viendo este tema.

Suji

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 (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;
}

ivancea96

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

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

Suji

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.

Suji

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.

ivancea96

Cuidado con eso. El problema era:
Código (cpp) [Seleccionar]
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;
}


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 &.