using namespace std;

class map
{
    private:
        float result= 0;
    public:
        void func_1();
        void setres(float counter);
        float getres();
};
void map::setres(float counter)
{
    result= counter;
}
float map::getres()
{
    return result;
}
void map::func_1()
{
    float num_0=0, num_1=0, sum=0, i;
    
    map run;
    
    cout << run.getres() << " Result." << endl;
    if(result != 0)
        cout << "We already have a result saved and it's: " << run.getres() << endl;
    else
    {
        cout << "Give me first number: ", cin >> num_0;
        cout << "Give me second number: ", cin >> num_1;
        sum= num_0+num_1;
        cout << "Result is: " << sum << endl;
    }
    cout << "The program will save the result." << endl;
    run.setres(sum);
    cout << "The saved result is: " << run.getres() << "\nPress 1 to repeat the function and check\nif the result is saved." << endl;
    cin >> i;
    if(i==1)
        run.func_1();    
}

int main()
{
    map go;
    go.func_1();
    return 0;
}

No sé por qué no se guarda la variable privada resultado . ¿Y cómo puedo hacer que funcione?

Luego empiezo a compilar, funciona bien, el resultado privado está cambiando, pero luego vuelvo a abrir la función, el resultado vuelve a 0 y quería que fuera el último resultado.

Ejemplo: pongo 4 pongo 7 La suma es 11 Y el resultado guardado es 11 Luego presiono 1 para ir al inicio, el resultado es 0 nuevamente, pero quería que fuera 11 y no 0.

1
Clarence 8 may. 2021 a las 02:34

3 respuestas

La mejor respuesta

Dentro de la función está creando una variable local del tipo mapa

map run;

El resultado del miembro de datos del cual se cambia. Es decir, la función no cambia el resultado del miembro de datos del objeto para el que se llama a la función.

Además, por ejemplo, en este fragmento de código

cout << run.getres() << " Result." << endl;
if(result != 0)

Está accediendo al resultado del miembro de datos de dos objetos diferentes. En la primera declaración

cout << run.getres() << " Result." << endl;

Está accediendo al miembro de datos del objeto local run mientras está en la siguiente declaración

if(result != 0)

Está accediendo al resultado del miembro de datos del objeto (el objeto go declarado en main) para el que se llama a la función miembro.

Así que elimine la declaración en la función

map run;

Y en lugar de expresiones como, por ejemplo, run.getres() use solo getres() o this->getres().

1
Vlad from Moscow 7 may. 2021 a las 23:45

El problema es que su función no utiliza miembros del objeto en el que se llama al método. En su lugar, crea una nueva instancia dentro de la función:

void map::func_1()
{
    float num_0=0, num_1=0, sum=0, i;
    
    map run;  // <---------- here
    //...

Es por eso que cada vez que llamas a la función obtienes un nuevo objeto nuevo. No es necesario que cree esa instancia. Ya creaste uno en main y dentro de las funciones de miembros puedes acceder a sus miembros. Como solución, puede eliminar todos los run. del código. P.ej

cout << run.getres() << " Result." << endl;

->

cout << getres() << " Result." << endl;

O si lo prefieres

cout << this->getres() << " Result." << endl;
0
largest_prime_is_463035818 7 may. 2021 a las 23:41

El valor se guarda en run y se llama a run.func_1() para comprobarlo, pero luego se llama a run.getres() allí. Este run es un nuevo objeto map y difiere del run en el que se guardan los datos.

Marcó result != 0, pero utilizó run.getres() para imprimir el resultado. Inconsistencia aquí.

En lugar de

    cout << run.getres() << " Result." << endl;
    if(result != 0)
        cout << "We already have a result saved and it's: " << run.getres() << endl;

Deberías hacer

    cout << result << " Result." << endl;
    if(result != 0)
        cout << "We already have a result saved and it's: " << result << endl;

O

    cout << getres() << " Result." << endl;
    if(getres() != 0)
        cout << "We already have a result saved and it's: " << getres() << endl;
0
MikeCAT 7 may. 2021 a las 23:45