es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C++ ¿cómo sobrecargar el operador < para números complejos?

El siguiente código funciona para comparar dos números complejos en C++:

#include <iostream>
#include <math.h>

class Complex {
private:
    float real;
    float imag;
public:
    Complex(float realVal, float imagVal): real(realVal), imag(imagVal) {}

    double magnitude() {
        return sqrt(real*real)+sqrt(imag*imag);
    }

    friend bool operator<(Complex& c1, Complex& c2) {
        if(c1.magnitude() < c2.magnitude()){
            return true;
        }
        return false;
    }
};

int main() {
    Complex c1(3, 3);
    Complex c2(4, 4);
    std::cout << (c2 < c1) << std::endl;

    return 0;
}

Sin embargo, no puedo hacer que la función operator<() funcione con parámetros const, debido a magnitude(). Específicamente, se produce el siguiente error: error: passing ‘const Complex’ as ‘this’ argument discards qualifiers [-fpermissive]. ¿Cuál es la solución a ese problema?</math.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema de no poder usar parámetros const en la función operator<() debido al uso de magnitude(), podemos declarar magnitude() como una función const. Esto indica que la función no modifica ninguna variable miembro de la clase Complex y se puede llamar de forma segura en instancias const de la clase.

    Para hacer que magnitude() sea una función const, necesitamos agregar la palabra clave const después de la declaración de la función:

    double magnitude() const
    {
        return sqrt(real*real) + sqrt(imag*imag);
    }
    

    A continuación, debemos actualizar nuestra función operator<() para que tome referencias const a objetos Complex, indicando que no modifica ninguno de los parámetros:

    friend bool operator<(const Complex& c1, const Complex& c2)
    {
        if(c1.magnitude() < c2.magnitude())
        {
            return true;
        }
        return false;
    }
    

    Con estos cambios, podemos usar instancias const de la clase Complex con la función operator<() sin ningún error.

Comments are closed.