Ayuda C++ Overload operator.
Resultados 1 al 4 de 4

Tema: Ayuda C++ Overload operator.

  1. #1
    Usuario Avatar de VLAD
    Ubicación
    Ibarra, Imbabura, Ecuador
    Mensajes
    124
    Gracias
    72
    Agradecido 105 veces en 47 posts

    Thumbs up Ayuda C++ Overload operator.

    Ya se que estaba mal




    Amigos,

    Me he topado con un problema que no logro entender, espero me puedan ayudar.

    Estoy realizando un API para el manejo de matrices, y tengo el problema de Sobrecargar el operador de asignación '='

    La clase se llama 'Matriz' y el operador esta declarado de la siguiente manera:

    Código:
    Matrix operator = ( Matrix rightM );
    Esta declaración funciona cuando asigno explícitamente.
    Código:
    Matrix obj1, obj2;
    
    obj1.llenarMatriz();
    
    obj2 = obj1;
    El código anterior funciona. Pero cuando tengo una función que regresa un objeto Matriz, he intento asignarla a un objeto, no funciona, es decir la matriz se llena de ceros en este caso, el objeto es destruido antes de llegar a la funcion operator =.

    Código:
    const Matrix invertir (  );
    
    ...
    ...
    ...
    
    
    obj2 = obj1.invertir();

    Ahora lo voy a detallar un poco más.


    La clase matriz utiliza el template <vector> para crear un arreglo bi-dimensional.

    Código:
    vector < vector< float > > _matrix;
    cuando llamo al operador de asignación, esta función debe redimensionar la matriz (filas, columnas) para que se ajuste a los nuevos datos que debe contener.

    A continuación una versión muy resumida de la clase matriz.


    Código:
    class Matrix{
    public:
    
    
    /// Crea una nueva Matrix de dimensiones [ Row x Cols ]
    Matrix( int Rows, int Cols )
    {
        _matrix.resize(_nRows);
        for( int i = 0; i < _nRows; i++ )
            _matrix[i].resize(_nCols);
    }
    
    Código:
    
    Matrix operator = ( Matrix rightM ){
    
         _nRows = rightM._nRows;
         _nCols = rightM._nCols;
    
         _matrix.resize( rightM._nRows );
    
         for( int i = 0; i < rightM._nRows; i++ )
             _matrix [i].resize(rightM._nCols);
    
    
         for( int i = 0; i < _nRows; i++ )
             for( int j = 0; j < _nCols; j++ )
                 _matrix[i][j] = rightM._matrix[i][j];
    
          return *this;
     }
    
    static Matrix DotProduct( Matrix &leftM, Matrix &rightM )
    {
       if( leftM.getCols() == rightM.getRows() )
        {
            Matrix resultM ( leftM.getRows(), rightM.getCols() );
    
    
            float partial = 0;
    
    
            for( int i = 1; i <= resultM.getRows(); i++ )
            {
                for( int j = 1; j <= resultM.getCols(); j++ )
                {
                    for( int m = 1; m <= rightM.getRows(); m++ )
                  
                        partial += leftM.getNumber( i, m ) * rightM.getNumber( m, j );
                        
                    resultM.add( i, j, partial );
                }
                partial = 0;
            }
    
            return resultM;
    }
    
    private:
    
    
        /** 2-D Vector Array*/
        vector < vector<float> > _matrix;
    
    
        /** Number of Rows in Matrix*/
        int _nRows;
    
    
        /**Number of Columns in Matrix*/
        int _nCols;
    
    
    };
    
    
    



    ¿Alguna de idea de que puede estar mal? O de como se sobrecarga el operador de manera correcta? Porque de acuerdo a las pruebas que he realizado el problema esta en la función sobrecargada del operador. He intentado hacer lo mismo con clases más sencillas y funcionan bien siempre y cuando no sobrecargue el operador, pero cuando lo sobrecargo, no admite objetos que retornen de Funciones. Es decir una función que retorne un objeto de la misma clase no queda asignado. Es como si no 'viviera' lo suficiente para llegar a la función '='.


    Última edición por VLAD; 17/10/2011 a las 04:04 Razón: PROBLEMA RESUELTO
    MID - Mecahtronics Intelligent Design
    mecatronica.mid@gmail.com

  2. #2
    Usuario Avatar de jakala
    Mensajes
    361
    Gracias
    120
    Agradecido 273 veces en 139 posts
    buenas:

    he estado repasando un poco lo de la sobrecarga, y en un par de ejemplos que he visto, siempre ponen en la definición de la sobrecarga, el tipo de objeto devuelto ACABADO con &.

    Si fuera esto, tendrias que poner en tu sobrecarga:

    Matrix& operator = (Matrix rightM){}

    Esto tendria sentido, porque asi devuelves en el return con un *.

    Te pongo el enlace de donde he estado viendo el tema: Programación en C++/Sobrecarga de Operadores - Wikilibros
    Dicen que "rectificar" es de sabios...pero hay que tener "capacidad" y soportar la "tension"
    -------------------

    www.jakala.es
    Actualmente disponible dias y horas aleatorias (es decir, cuando enciendo el server)
    -------------------
    Cuatro cosas malas tiene el mundo:

    La boca de Jakala es lo primero;
    el buche del milano lo segundo;
    las manos de los monos es lo tercero;
    y, como nunca logra verse harto
    el ojo humano, siempre fue lo cuarto.

  3. Los siguientes usuarios agradecen a jakala por este post:

    VLAD (17/10/2011)

  4. #3
    Usuario
    Ubicación
    Barcelona - Catalunya
    Mensajes
    44
    Gracias
    6
    Agradecido 23 veces en 16 posts
    Opino lo mismo que jakala, es más incluso te recomendaría que le pases la matriz por referencia en el parámetro 'rightM', ya que al pasar el parámetro tal cual estas haciendo otra copia.

    En definitiva, lo ideal seria hacer que la declaración quede de la siguiente forma :
    Código:
    Matrix &operator = (const Matrix &rightM);
    Y esto requerirá que tengas un constructor copia habilitado con la siguiente declaración :
    Código:
    Matrix(const Matrix &Copy);
    Saludos
    Última edición por devildrey33; 13/10/2011 a las 07:28

  5. Los siguientes usuarios agradecen a devildrey33 por este post:

    VLAD (17/10/2011)

  6. #4
    Usuario Avatar de VLAD
    Ubicación
    Ibarra, Imbabura, Ecuador
    Mensajes
    124
    Gracias
    72
    Agradecido 105 veces en 47 posts

    Problema resuelto...

    al fin encontre el BUG!!!

    tienen razón con lo de la referencia, es para ahorrar memoria y evitar una llamada al constructor. Pero como no me salia y no sabia porque empeze a jugar con la referencia '&' a ver si a la fuerza se arreglaba jeje...


    Tuve que leerme algunos libros y nada al final encontre mi respuesta aqui, pero que bien que logre resolver este problema....

    "Existen tres casos generales en los cuales se llama al constructor de copia, en lugar del operador de asiganación:
    1. Cuando al instanciar un objeto e iniliazarlo con valores de otro objeto:
    2. Cuando se pasa el objeto por valor.
    3. Cuando el objeto es retornado de una función por valor."
    Ese era mi problema. Debido a que uso el Template ( vector < type > ) cuando llamo al Constructor de copia mi objeto matriz sólo quedaba definido su tamaño, el constructor no copiaba lo que contenía la matriz.

    Esto es lo que tenia para el constructor de copia:

    /// Defines the same parameters as 'base' Matrix
    Matrix::Matrix(const Matrix& base)
    {
    _nCols = base._nCols;
    _nRows = base._nRows;
    _matrix.resize(_nRows);
    for( int i = 0; i < _nRows; i++ )
    _matrix[i].resize(_nCols);


    }

    Luego lo le agregue que ademas copie los elementos de la matriz.

    /// Defines the same parameters as 'base' Matrix
    Matrix::Matrix(const Matrix& base)
    {
    _nCols = base._nCols;
    _nRows = base._nRows;
    _matrix.resize(_nRows);
    for( int i = 0; i < _nRows; i++ )
    _matrix[i].resize(_nCols);


    for( int i = 0; i < _nRows; i++ )
    for( int j = 0; j < _nCols; j++ )
    _matrix[i][j] = base._matrix[i][j];
    }



    Y eso fue todo, problema solucionado.... ahora si podre dedicarme a escribir la clase para las operaciones de la matriz!
    MID - Mecahtronics Intelligent Design
    mecatronica.mid@gmail.com

Los visitantes encuentran esta página buscando por:

c overload operator

sacar calendario en c mes arrays

sobrecarga del operador *= en c

overload operator c

sobrecarga del operador *= c

hacer un calendario con matrices (c )

c override sobre carga

sobrecarga del operador = con arreglos en c

c operador copia

sobrecarga overload c#

hacer un calendario con con matrices en c

uso de overload en c

hacer un override en c

clase matriz en c con sobrecarga de operadores

operator [] c overload

overload operator que te devuelve un float

operator c overload

como hacer una overload

invertir una matriz en c

como hacer overloads en c

override c

calendario en c con matrices

como hacer un calendario con arrays en c

hacer un calendario en lenguaje c con arrays

como hacer un calendario con array en c

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37