3

queria ver si me podian ayudar ya que me sale este mensaje de error:

introducir la descripción de la imagen aquí

Me he estado guiando por un libro de C++ y la verdad tengo el mismo código que sale ahí, pero me salta ese error, el programa lo que hace es realizar sumas utilizando la sobrecarga de constructores.

Adjunto mi codigo:

#include <iostream>
using namespace std;

class sumar{
  public:
    int suma(int a, int b);
    int suma(int a, int b, int c);
    float suma(float a, float b);
    float suma(float a, float b, float c);
  };

  /* Metodos */

  int sumar::suma(int a, int b){
    return (a+b);
  }
  int sumar::suma(int a, int b, int c){
    return (a+b+c);
  }
  float sumar::suma(float a, float b){
    return (float)(a+b);
  }
  float sumar::suma(float a, float b, float c){
    return (float) (a+b+c);
  }

  int main(void){
    sumar mi_suma;
    /* Primer meotodo */
    cout << "\n\nSuma 1: " << mi_suma(1,2);
    /* Segundo metodo */
    cout << "\nSuma 2: " << mi_suma(1,2,3);
    /* Tercer metodo */
    cout << "\nSuma 3: " << mi_suma(3.1,2.7);
    /* Cuarto metodo */
    cout << "\nSuma 4: " << mi_suma(3.1,2.7,10.2) << "\n\n";
  }

Muchas gracias.

Crisandru
  • 33
  • 4

2 Answers2

5

Necesitas llamar el método desde tu objeto, de la forma:

objeto.método()

En tu caso el compilador cree que tiene que buscar una función llamada mi_suma, en vez de un método del objeto.

Para tu caso:

int main(void){
    sumar mi_suma;
    /* Primer meotodo */
    cout << "\n\nSuma 1: " << mi_suma.suma(1,2);
    /* Segundo metodo */
    cout << "\nSuma 2: " << mi_suma.suma(1,2,3);
    /* Tercer metodo */
    cout << "\nSuma 3: " << mi_suma.suma(3.1,2.7);
    /* Cuarto metodo */
    cout << "\nSuma 4: " << mi_suma.suma(3.1,2.7,10.2) << "\n\n";
  }

También te recomiendo usar la constante flotante con f al final para que el compilador lo interprete como un float y no como un double, así no tienes que hacer la sobrecarga para double, así:

int main(void){
    sumar mi_suma;
    /* Primer meotodo */
    cout << "\n\nSuma 1: " << mi_suma.suma(1,2);
    /* Segundo metodo */
    cout << "\nSuma 2: " << mi_suma.suma(1,2,3);
    /* Tercer metodo */
    cout << "\nSuma 3: " << mi_suma.suma(3.1f,2.7f);
    /* Cuarto metodo */
    cout << "\nSuma 4: " << mi_suma.suma(3.1f,2.7f,10.2f) << "\n\n";
  }
FranAcuna
  • 4,058
  • 1
  • 6
  • 19
5

El error es claro y conciso, tal vez no lo entiendes por estar en inglés. Te lo traduzco:

type 'sumar' does not provide a call operator.
el tipo 'sumar' no proporciona un operador de llamada.

Un operador de llamada es el operador paréntesis (()), puedes establecer parámetros arbitrarios a dicho operador igual que si fuese una función, los cambios que debes hacer a tu código para usar el operador de llamada son los siguientes:

class sumar{
public:
    int operator()(int a, int b);                // Operador de llamada (int, int)
    int operator()(int a, int b, int c);         // Operador de llamada (int, int, int)
    float operator()(float a, float b);          // Operador de llamada (float, float)
    float operator()(float a, float b, float c); // Operador de llamada (float, float, float)
};

int sumar::operator()(int a, int b){
    return (a+b);
}

int sumar::operator()(int a, int b, int c){
    return (a+b+c);
}

float sumar::operator()(float a, float b){
    return (float)(a+b);
}

float sumar::operator()(float a, float b, float c){
    return (float) (a+b+c);
}

Si en realidad querías llamar a la función miembro sumar::suma, las llamadas en main deberían ser así:

int main() {
    sumar mi_suma;
    /* Primer meotodo */
    cout << "\n\nSuma 1: " << mi_suma.suma(1,2);
    //                                ~~~~ <--- Llama a sumar::suma(int, int)
    /* Segundo metodo */
    cout << "\nSuma 2: " << mi_suma.suma(1,2,3);
    //                              ~~~~ <--- Llama a sumar::suma(int, int, int)
    /* Tercer metodo */
    cout << "\nSuma 3: " << mi_suma.suma(3.1,2.7);
    //                              ~~~~ <--- Debería llamar a sumar::suma(double, double)
    /* Cuarto metodo */
    cout << "\nSuma 4: " << mi_suma.suma(3.1,2.7,10.2) << "\n\n";
    //                              ~~~~ <--- Debería llamar a sumar::suma(double, double, double)
}

Otras cosas a tener en cuenta.

  1. No conviertas a float datos que ya son float, es bastante confuso:

    float sumar::suma(float a, float b){
        return (a+b); // 'a' y 'b' ya son float, la conversión es innecesaria
    }
    float sumar::suma(float a, float b, float c){
        return (a+b+c);  // 'a', 'b' y 'c' ya son float, la conversión es innecesaria
    }
    
  2. El literal de float incluye el sufijo f, si no pones dicho sufijo cualquier número con coma flotante será double:

    cout << "\nSuma 3: " << mi_suma(3.1f, 2.7f);
    // Literales 'float' ------------> ^     ^
    cout << "\nSuma 4: " << mi_suma(3.1f, 2.7f, 10.2f) << "\n\n";
    // Literales 'float' ------------> ^     ^      ^
    
  3. En , cuando un método no recibe parámetros, se deja su lista de parámetros vacía en lugar de poner void:

    int main() // Correcto.
    
    int main(void) // Incorrecto.
    
  4. La función main debe devolver un valor. Lee este hilo para saber más del tema.

    int main() {
    
       ...
    
       return 0;
    }
    

Consejo.

No es práctico repetir funciones para que hagan lo mismo, en su lugar usa plantillas:

class sumar{
public:
    template <typename ... TIPOS>
    auto suma(TIPOS ... valores)
    {
         return (valores + ...);
    }
};

Puedes ver el código funcionando en Try it online!.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82