大家好,我遇到了问题。我很新,一直试图解决它。
当我运行它时,它为华氏度到摄氏度打印0的第一部分是正确的但是一旦我输入一个数字,它就会输出我输入的数字。我知道这可能是一个简单的答案,但谢谢你的时间。
#include <iostream>
using namespace std;
class Temp
{
public:
Temp(); //CONSTRUCTOR: Sets private variable for Fahrenheit to 32
void InputF(float F); //Initialize Fahrenheit temperature to F
void Celsius(); //PRINTS the Celsius temperature corresponding to
// the private Fahrenheit equivalent temperature
void ChangeBy(float D); //Changes the private Fahrenheit temperature
// by D degrees.
float Fahrenheit(); // returns the value of the private Fahrenheit temp
private:
float Fah; //Fahrenheit Temperature
};
int main() {
float FF;
Temp T; // Temperature Object
T.Celsius();
cout << endl; //Note that the value will be 0 since the private variable is 32.
cout << "Input a Fahrenheit temp: ";
cin >> FF;
T.InputF(FF);
cout << T.Fahrenheit() << endl;;
T.ChangeBy(34);
cout << T.Fahrenheit() << endl;
system("Pause");
return 0;
}
Temp::Temp() {
Fah = 32;
}
void Temp::InputF(float F) {
Fah = F;
}
void Temp::Celsius() {
cout << Fah;
}
void Temp::ChangeBy(float D) {
Fah = (5.0 / 9) * (Fah - 32);
}
float Temp::Fahrenheit() {
return Fah;
}
答案 0 :(得分:1)
所以,有一个问题:
void Temp::ChangeBy(float D)
{
Fah = (5.0/9)* (Fah - 32);
}
此方法不会像您在类声明中所做的那样做;您的评论表明它会根据传递给它的 Fahrenheit 度数更新Fah
。
如果我可以建议以下更改:
ChangeBy
只需将输入值添加到Fah
:void Temp::ChangeBy( float D )
{
Fah += D;
}
Celcius
方法执行转换并返回转换后的值:float Temp::Celcius()
{
return (5.0/9.0) * (Fah - 32.0);
}
main
函数中,将Temp::Celcius()
的输出写入输出流:std::cout << T.Celcius() << std::endl;
修改强>
我冒昧地重写你的代码来表明我的意思;单个评论中没有足够的空间来真正理解这一点:
#include <iostream>
using namespace std;
class Temp
{
public:
Temp( float f = 32.0 ); // slight change here
void InputF(float F);
float Celsius() const; // note return type, addition of const
void ChangeBy(float D);
float Fahrenheit() const; // note addition of const
private:
float Fah;
};
int main() {
float FF;
Temp T;
cout << T.Celsius(); // Note that we output the result of Celsius in
// exactly the same manner that we do for
// Fahrenheit below.
cout << endl;
cout << "Input a Fahrenheit temp: ";
cin >> FF;
T.InputF(FF);
cout << T.Fahrenheit() << endl;
T.ChangeBy(34);
cout << T.Fahrenheit() << endl;
return 0;
}
/**
* Slight change here; we're using a member initializer, rather than
* assigning Fah in the body of the constructor. For a simple class
* like this it doesn't matter, but when you start getting into derived
* and virtual classes, using this method will make sure things get
* initialized in the right places and in the right order.
*/
Temp::Temp( float f ) : Fah(f) {
}
void Temp::InputF(float F) {
Fah = F;
}
float Temp::Celsius() const {
return (5.0f / 9.0f) * ( Fah - 32.0f ); // use f suffix for float constants
}
void Temp::ChangeBy(float D) {
Fah += D; // Update the value of Fah by the input value; the code you
// posted isn't using the value of D to update Fah, it was
// simply converting Fah to Celsius.
}
float Temp::Fahrenheit() const {
return Fah;
}
此代码使用带有g++
标志的-pedantic -Wall -Werror
在Linux系统上构建和运行。
所以,我已将Celsius
的返回类型从void
更改为float
;而不是让Celsius
打印该值,它只是将值返回到main
。这种方式Celsius
不必担心输出写入的 (例如,如果你想写一个文件而不是cout
,那么它)焦点现在要窄得多。
我也改变了ChangeBy
功能;在您上面粘贴的实现中,您实际上并不是使用输入参数D
来更改Fah
的值;你只是将Fah
的值从华氏温度转换为Celcius。
请注意,我还在const
和Fahrenheit
方法中添加了尾随Celsius
限定符。这表明这两种方法不会尝试更新Temp
内部的任何数据。以这种方式制作这种“查询”方法const
是个好主意;它使您无法编写能够在不应该进行更改的地方编写代码。