变量打印为nan或inf而不是实际值

时间:2014-07-08 23:58:38

标签: c++ class variables nan

我正在研究一个基于距离和速度来计算时间的程序,当我把最后时间从a点到达b点而不是100英里时,我得到了nan或者inf取决于我的班级设置方式。有人可以帮助我吗?

我班级的一部分:

class Trip
{
private:
    string chicago, illinois, destCity, destState;
    double distance, time, rate;

public:
    Trip()
    {
        chicago = "Chicago";
        illinois = "Illinois";
        destCity = "";
        destState = "";
        distance = 0.0;
        time = 0.0;
        rate = 0.0;
    }

    Trip(string city, string state, double distance)
    {
        chicago = "Chicago";
        illinois = "Illinois";
        destCity = city;
        destState = state;
        distance = 0.0;
        time = 0.0;
        rate = 0.0;
    }

这是构造函数在我的main方法中的样子:

Trip atlanta("Atlanta", "Georgia", 587); 

然后这里有一些可能成为问题一部分的mutator方法:

void Trip::setRate(double mph)
{
    mph = rate;
}

void Trip::calcTime()
{
    time = distance/rate;
}

现在,如果我像我这样设置我的课程

this->city = "";
this->distance = 0.0;

当我使用辅助方法来检索时间,距离等时,打印为“nan”但如果我的班级设置为类似

city = "";
distance = 0.0;
然后我得到“inf”。 当我调试程序时,即使我使用构造函数将值传递给类成员,trip对象也会显示所有变量为0。我不知道出了什么问题。

1 个答案:

答案 0 :(得分:3)

在此功能中:

Trip(string city, string state, double distance)
{
    // ...
    distance = 0.0;

最后一行设置函数参数 distance。不是班级成员。班级成员仍然没有经营,所以当你有时打印出来时你会得到垃圾。

要解决此问题,您可以编写this->distance = 0.0;,或者最好使用构造函数初始化列表:

Trip(string city, string state, double distance)
    : chicago("Chicago")
    , distance(distance)
    , // etc.
 {
 }

和/或使用不同的参数名称,而不是用于类成员。

在初始化列表中,distance(distance)表示this->distance初始化为参数distance,因为括号外的内容必须是类成员的名称。


在C ++ 11中,您可以在类定义中设置默认值,这样可以避免在每个构造函数中重复它们:

class Trip
{
private:
    string chicago, illinois, destCity, destState;
    double distance = 0.0;
    double time = 0.0;
    double rate = 0.0;

请注意,无需将string初始化为空白;他们有一个默认的构造函数,所以未初始化的strings保证是空字符串,而不是垃圾。