Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: Suji en 17 Septiembre 2016, 13:52 PM

Título: [C++] Sobrecarga de Operadores
Publicado por: Suji 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 (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;
}
Título: Re: [C++] Sobrecarga de Operadores
Publicado por: ivancea96 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.
Título: Re: [C++] Sobrecarga de Operadores
Publicado por: Suji 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.
Título: Re: [C++] Sobrecarga de Operadores
Publicado por: Suji 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.
Título: Re: [C++] Sobrecarga de Operadores
Publicado por: ivancea96 en 17 Septiembre 2016, 23:04 PM
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 &.