当我尝试检查字段的值时,为什么会得到一个奇怪的答案?

时间:2013-10-19 00:38:50

标签: c++ object parameters field

我在C ++中遇到这个小问题:

我在名为angle.cpp的文件中创建了一个名为Angle的对象。 它有一个名为degrees的字段double

这是我的构造函数:

Angle::Angle(double deg)
{
   degrees = deg;
}

我在一个单独的头文件中为我的Angle类提供了适当的声明作为标准。 到目前为止,一切看起来都很简单。

然而,在我的main.cpp中,我在我的一个函数中有这个:

double value;
cin >> value;
Angle angle = Angle(value);

此时angle对象的degrees应该具有我在cin输入的任何值吗?

我在angle.cpp中有另一个名为getDegrees()的函数,只返回degrees,因为我在头文件中将degrees设为私有

但是当我查看cout << angle.getDegrees()时,我会得到一个奇怪的数字,例如6.64651e-315,这绝对不是我通过value cin提供的。

3 个答案:

答案 0 :(得分:0)

两个建议:

1)如下所示声明它时初始化“value”,以便它不包含随机代码。

2)冲洗cin缓冲区

double value = 0;

// Clear the cin error flag
cin.clear();

// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

cin >> value; 
Angle angle = Angle(value);

我希望有所帮助。

请注意,您应该在使用cin后调用cin.clear(清除错误标志)和cin.ignore(清除缓冲区),如下所示。您可能在程序的早期读取了一些数据而没有刷新缓冲区。读入数据后不刷新缓冲区有时会将数据保留在下次读取数据时显示的cin缓冲区中。

例如,如果您尝试使用cin读取数据并生成错误,则会设置错误标志,导致所有未来的cin操作失败(cin.clear重置标志)。此外,导致错误的数据可能仍然位于cin缓冲区中(cin.ignore将其刷新)。

cin >> value;  
cin.clear();  // Always call these two commands after using cin
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

最后评论: 您经常会看到cin.ignore的这种较短格式

cin.ignore(10000, '\n')

这也会忽略最多10000个字符而跳到下一个换行符,但上面显示的第一种方法是正确的符合C ++标准的技术。

如果您发布整个main.cpp和angle.cpp,我确信有10个人会在30秒内跳出正确答案。

答案 1 :(得分:0)

你可以检查(或在这里发布)getDegrees的定义(这里是一个可以预期的示例代码)

double Angle::getDegrees()
{
    return degrees;
}

注意: 与您的问题无关,但您的构造函数也可以写为:

Angle::Angle(double deg) : degrees(deg) 
{
}

答案 2 :(得分:0)

我在Mac上做了这个:

#include <iostream>

class Angle
{
  double degrees;

  public:
  Angle(double deg) { degrees = deg;}
  Angle() {};
  double getDegrees() { return degrees;}
 };

int main (int argc, char** argv)

{
  double d;
  std::cout << "Give me some degrees: ";
  std::cin >> d;
  Angle a = Angle(d);
  std::cout << a.getDegrees() << "\n";
  std::cout << Angle(d).getDegrees() << "\n";
  Angle b;
  std::cout << b.getDegrees() << "\n";
}

我得到了:

Give me some degrees: 24
24
24
6.95323e-310

所以我怀疑你是从一个未初始化的角度得到的。您是否定义了这样的复制构造函数,可能:

Angle(Angle& angle){};