La función recursiva no devuelve el valor especificado

Resuelto Andrew asked hace 9 años • 2 respuestas

Estoy intentando depurar una función recursiva utilizada para validar la entrada del usuario y devolver un valor cuando la entrada es correcta. La función se ve así:

double load_price()
{
    double price;

    Goods * tempGd = new Goods();

    cin >> price;

    while (!cin)
    {
        cin.clear();
#undef max
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        cout << endl;
        cout << "You didn't enter a number. Do so, please: ";
        cin >> price;
    } // endwhile
    if (!tempGd->set_price(price))
    {
        cout << endl;
        cout << "The price " << red << "must not" << white << " be negative." << endl;
        cout << "Please, insert a new price: ";
        load_price();
    }
    else
    {
        delete tempGd;
        return price;
    }
}

El método set_price() de la clase Goods tiene el siguiente aspecto

bool Goods::set_price(double price)
{
    if (price> 0)
    {
        priceSingle_ = price;
        priceTotal_ = price* amount_;
        return true;
    }
    return false;
}

Intenté dibujar el problema en un papel, pero todos mis diagramas parecen tener el aspecto que ya tiene mi función. Creo que hay algunos problemas con las devoluciones, pero no sé dónde.

La ayuda sería muy apreciada.

Andrew avatar Dec 29 '14 22:12 Andrew
Aceptado

No estás utilizando el valor de retorno de la llamada recursiva. Necesitas hacer:

return load_price();
Barmar avatar Dec 29 '2014 15:12 Barmar

¿Quién te convenció de utilizar la recursividad para ese problema?

#undef max
double load_price()
{
   for(;;) {
      double price;
      cin >> price;
      if (!cin)
      {
         cin.clear();
         std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
         cout << endl;
         cout << "You didn't enter a number. Do so, please: ";
         continue;
      }
      if (!Goods().set_price(price))
      {
         cout << endl;
         cout << "The price " << red << "must not" << white << " be negative." << endl;
         cout << "Please, insert a new price: ";
         continue;
      }
      return price;
   }
}
Hans Klünder avatar Dec 29 '2014 15:12 Hans Klünder