Я уверен, что я делаю что-то неправильно, но я просто не могу понять. Я создал объект с целыми членами данных, и я хочу, чтобы функция-член возвращала частное от его членов как значение с плавающей запятой, которое оно делает. Затем он добавляет некоторые дополнительные вещи. Результат ниже программы, которая должна работать как есть.
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
class Rational
{
public:
explicit Rational(int = 0, int = 1);
double getRationalAsDouble() const;
private:
int numerator;
int denominator;
};
Rational::Rational(int numerator, int denominator)
{
if (denominator == 0)
this->denominator = 1;
else
this->denominator = denominator;
this->numerator = numerator;
}
// ******* Problem Function *********
double Rational::getRationalAsDouble() const
{
double a = 0.0, b = 0.0;
a = static_cast<double>(numerator);
b = static_cast<double>(denominator);
cout << endl << "a = " << a;
cout << endl << "b = " << b;
cout << endl << "a/b = " << (a/b);
}
// ******** End Problem Function ********
int main()
{
{ //Create a new Scope so that I can view Destructor Message, not used here
Rational c(2, 6);
int data = 10;
cout << c.getRationalAsDouble(); // prints rational object c as double, but not really
cout << "\n\n";
} // End of Scope
return 0;
} // end main
И вот вывод:
a = 2
b = 6
a/b = 0.3333332.31196e-317
Я играю вокруг, и если я изменю функцию, чтобы иметь в ней какое-то регулярное деление, она отлично работает. Что действительно интересно, если я добавляю какой-либо вывод после cout << endl << "a/b =" << (a/b); line, этот вывод обрабатывается до (a/b) части строки. Любая помощь будет принята с благодарностью! Заранее благодарю за ваше время.
Решение: функция ничего не возвращала. Когда код был изменен на:
double Rational::getRationalAsDouble()
{
return static_cast<double>(numerator)/denominator;
}
Он работал, как ожидалось. Спасибо, тс.
Три проблемы:
cout << endl << "a/b = " << (a/b);... cout << c.getRationalAsDouble(); cout << "\n\n";
cout << endl << "a/b = " << (a/b);... cout << c.getRationalAsDouble(); cout << "\n\n";
который печатает два двойных номера 0.333333
и 2.31196e-317
рядом друг с другом без пробелов.cout << "\n" << endl
вместо cout << "\n\n"
. endl
вызывает endl
потока; plain "\n" может и не быть.Rational::getRationalAsDouble()
не возвращает значение. Прослушайте предупреждения своего компилятора.Исправление выглядит примерно так
double Rational::getRationalAsDouble() const
{
double a = 0.0, b = 0.0;
a = static_cast<double>(numerator);
b = static_cast<double>(denominator);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "a/b = " << (a/b) << endl;
return a/b;
}
cout static_cast<double>(numerator)/denominator;
, но, очевидно, проблемы все еще были, потому что ничего не возвращалось. Я использую Dev-C ++, который не греет меня, если я не возвращаю значение. Я постепенно перешел на Visual C ++, который намного лучше, но у меня возникла проблема с этим сегодня, поэтому я просто вернулся к старой бетси. Еще раз спасибо, я ценю ваше время!
-Wall -Wextra -Wformat=2 -Wno-unused-parameter
в качестве отправной точки.
Ваша реализация Rational::getRationalAsDouble()
может быть упрощена для:
double Rational::getRationalAsDouble() const
{
return 1.0*numerator/denominator;
}
Я думаю, что у вас есть все остальное для целей отладки, и, следовательно, на самом деле не нужно.
a/b = 0.33333332
без добавления к нему.31196e-317
.