大家好,我遇到了问题。我还很新,并且一直试图解决它。

当我运行它时,它的第一部分显示摄氏温度为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的值从华氏温度转换为摄氏温度。

请注意,我还向constFahrenheit方法添加了结尾的Celsius限定符。这表明这两种方法将不会尝试更新Temp内部的任何数据。以这种方式制作这样的“查询”方法const是一个好主意。它使您不必编写在不应该进行更改的地方编写代码。

08-04 00:23