elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  duda con sobrecarga de operadores en clase vector [c++]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda con sobrecarga de operadores en clase vector [c++]  (Leído 3,267 veces)
andoporto

Desconectado Desconectado

Mensajes: 17


Ver Perfil
duda con sobrecarga de operadores en clase vector [c++]
« en: 5 Diciembre 2014, 01:33 am »

Hola gente estuve haciendo este ejercicio, pero al intentar hacer sobrecargar el operador resta (cuando son negativos los valores, al resultado me lo convierte a positivo )y el de división (me toma todos los valores como ceros) no me funciona correctamente, que podría ser?

main.cpp

Código:
#include <iostream>
#include "Vector.h"


using namespace std;


int main()
{
    Vector vec;
    vec.mostrar();
    cin>>vec;
    vec.mostrar();
    Vector vec1;
    cin>>vec1;
    vec1.mostrar();
    cout<<endl;
    cout<<"Suma de los vectores"<<endl;
    cout<<endl;
    cout<<(vec+vec1);
    cout<<"Resta de los vectores"<<endl;
    cout<<endl;
    cout<<(vec-vec1);
    cout<<"Multiplicacion de los vectores"<<endl;
    cout<<endl;
    cout<<(vec*vec1);
    cout<<"Division de los vectores"<<endl;
    cout<<endl;
    cout<<(vec/vec1);
    return 0;
    cout<<"\n"<<endl;
}


vector.cpp
Código:
#include "Vector.h"
#include <iostream>
#include <cstdlib>


using namespace std;


void igualarvector(int*,int*,int);
int* generarvector(int);




//vector::vector()
//{
//    tam=0;
//    *vec=NULL;
//}
Vector::Vector(int ta)
{
    this->tam=ta;
    vec=generarvector(tam);
    if(!vec && tam)
        cerr<<"sin memoria";
}
Vector::Vector(const Vector& obj)
{
    tam=obj.tam;
    vec=generarvector(tam);


    if(!vec && tam)
        cerr<<"sin memoria";
    else
        igualarvector(vec,obj.vec,tam);
}


Vector::~Vector()
{
    delete []vec;
}


int* generarvector(int tam)
{
    if(tam)
    {
        try
        {
            int* aux;


            aux=new int[tam];
            return aux;
        }
        catch(bad_alloc &ex)
        {
            cerr<<ex.what();
        }
    }


    return NULL;
}
///////////////////////////////////////////
void igualarvector(int* destino,int* origen,int tam)
{
    int i;


    for(i=0; i<tam; i++)
    {
        destino[i]=origen[i];
    }
}
/////////////////////////////////////////////////////////////
void Vector::mostrar()
{
    int i;


    if(vec)
    {
        for(i=0; i<tam; i++)
        {
            cout<<"vec["<<i<<"]: "<<vec[i]<<endl;
        }
    }
    else
    {
        cout<<"el vector no tiene elementos"<<endl;
        cout<<endl;
    }




}
//////////////////////////////////////////////////////////////////
istream& operator>> (istream& entrada,Vector& obj)
{
    int i;
    cout<<endl;
    cout<<"Ingrese el tamanio"<<endl;
    entrada>>obj.tam;
    delete [] obj.vec;
    obj.vec=generarvector(obj.tam);
    if(obj.tam)
    {
        cout<<endl;
        cout<<"Ingrese elemento: "<<endl;


        for(i=0; i<obj.tam; i++)
        {
            entrada>>obj.vec[i];
        }


    }
    else
        cerr<<"vector vacio error..."<<endl;
    cout<<endl;


    return entrada;
}
//////////////////////////////////////////////////////////////////////////////
Vector Vector :: operator+ (const Vector& obj)const
{


    int i;


    if(obj.tam==tam)
    {
        Vector resultado(tam);
        for(i=0; i<tam; i++)
        {


            resultado.vec[i]=obj.vec[i]+ vec[i];
        }
        return resultado;
        cout<<endl;


    }
    else
        cerr<<"error de tamanio"<<endl;
    cout<<endl;


    return Vector(0);
}


Vector Vector :: operator- (const Vector& obj)const
{


    int i;


    if(obj.tam==tam)
    {
        Vector resultado(tam);
        for(i=0; i<tam; i++)
        {


            resultado.vec[i]=obj.vec[i]- vec[i];
        }
        return resultado;
        cout<<endl;


    }
    else
        cerr<<"error de tamanio"<<endl;
    cout<<endl;


    return Vector(0);
}


Vector Vector :: operator* (const Vector& obj)const
{


    int i;


    if(obj.tam==tam)
    {
        Vector resultado(tam);
        for(i=0; i<tam; i++)
        {


            resultado.vec[i]=obj.vec[i] * vec[i];
        }
        return resultado;
        cout<<endl;


    }
    else
        cerr<<"error de tamanio"<<endl;
    cout<<endl;


    return Vector(0);
}


Vector Vector :: operator/ (const Vector& obj)const
{


    int i;


    if(obj.tam==tam)
    {
        Vector resultado(tam);
        for(i=0; i<tam; i++)
        {


            resultado.vec[i]=obj.vec[i]- vec[i];
            if (vec[i]==0)
                std::exit(EXIT_FAILURE);
        }
        return resultado;
        cout<<endl;


    }
    else
        cerr<<"error de tamanio"<<endl;
    cout<<endl;


    return Vector(0);
}






ostream& operator<<(ostream&salida,const Vector&obj)
{
    if(obj.vec)
    {
        for(int i=0; i<obj.tam; i++)
        {
            salida<<obj.vec[i]<<endl;
        }
    }
    else
        cout<<"no existe vector"<<endl;
    cout<<endl;


    return salida;
}

vector.c

Código:
#ifndef VECTOR_H
#define VECTOR_H
#include <iostream>


using namespace std;


class Vector
{
    public:
       //Vector();
        Vector(int=0);
        Vector(const Vector&);
        ~Vector();
    void mostrar();
    friend istream& operator>>(istream&,Vector&);
    Vector operator+(const Vector&)const;
    Vector operator-(const Vector&)const;
    Vector operator*(const Vector&)const;
    Vector operator/(const Vector&)const;
    friend ostream& operator<<(ostream&,const Vector&);
    private:
        int tam;
        int* vec;


};


#endif // VECTOR_H


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: duda con sobrecarga de operadores en clase vector [c++]
« Respuesta #1 en: 5 Diciembre 2014, 08:36 am »

Matemáticas básicas. a - b no es lo mismo que b - a.

Cuando tu escribes "a-b" el compilador sustituye ese código por a.operator-(b), es decir, llama a la función "operator-" de a, no de b.

Si la implementación de la función luce tal que:

Código
  1. POO POO::operator-( POO b )
  2. {
  3.  POO res.variable = b.variable - variable;
  4. }

Entonces el resultado de la operación es b - a, no a - b. Y con la división lo mismo.

Hay que tener especial cuidado con ciertas operaciones aritméticas.

Por otro lado, te digo lo que a todos, va siendo hora de que aprendas a utilizar el depurador de código. Se que al principio cuesta un poco, pero tienes que pasar por ello antes o después... y cuanto antes mejor para ti.

Un saludo.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Sobrecarga de operadores (con punteros a clase)
Programación C/C++
Namida 0 3,056 Último mensaje 29 Diciembre 2010, 12:42 pm
por Namida
[Duda] Sobrecarga de operadores
Programación C/C++
BlackZeroX 4 2,766 Último mensaje 13 Junio 2011, 20:55 pm
por BlackZeroX
C++ - Sobrecarga de operadores
Programación C/C++
eltongabinghiman 2 2,733 Último mensaje 14 Marzo 2012, 18:14 pm
por x64core
[Resuelto] Duda con destructores - vector de una clase
Programación C/C++
X3R4CK3R 8 3,353 Último mensaje 15 Julio 2013, 17:25 pm
por X3R4CK3R
Duda [Sobrecarga de operadores]
Programación C/C++
Abril7 1 1,503 Último mensaje 22 Noviembre 2016, 22:40 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines