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

Why am I getting a weird answer when I try to check the value of a field?

本文关键字:一个 答案 检查 字段 为什么      更新时间:2023-10-16

我在C++有这个小问题:

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

这是我的构造函数:

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

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

但是在我的主要功能中.cpp我在我的一个功能中都有这个:

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

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

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

但是当我用cout << angle.getDegrees()检查时,我得到了一个像6.64651e-315这样的奇怪数字,这绝对不是我通过cinvalue的。

你能检查(或在这里发布)getDegrees的定义吗(这是可以期待的示例代码)

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

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

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

我在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){};

两个建议:

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++ 标准的适当技术。

如果你发布你的整个主要.cpp和角度.cpp,我相信 10 个人会在 30 秒内跳上正确答案。

相关文章: