Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Suji

#1
Programación C/C++ / [C++] Sobrecarga de Operadores
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;
}
#2
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.