大家好,我遇到了问题。我还很新,并且一直试图解决它。
当我运行它时,它的第一部分显示摄氏温度为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;
}
最佳答案
因此,一个问题:
void Temp::ChangeBy(float D)
{
Fah = (5.0/9)* (Fah - 32);
}
此方法不执行您在类声明中说的操作;您的评论说,它会将传给它的华氏度数更新为
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
的值从华氏温度转换为摄氏温度。请注意,我还向
const
和Fahrenheit
方法添加了结尾的Celsius
限定符。这表明这两种方法将不会尝试更新Temp
内部的任何数据。以这种方式制作这样的“查询”方法const
是一个好主意。它使您不必编写在不应该进行更改的地方编写代码。