我正在研究一个基于距离和速度来计算时间的程序,当我把最后时间从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。我不知道出了什么问题。
答案 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
保证是空字符串,而不是垃圾。