1

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

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

这是我的构造函数:

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

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

但是,在我的 main.cpp 中,我的一个函数中有这个:

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

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

getDegrees()在 angle.cpp 中调用了另一个函数,它只返回任何degrees内容,因为我degrees在头文件中设为私有

但是当我检查 a 时cout << angle.getDegrees(),我得到一个奇怪的数字,例如6.64651e-315,这绝对不是我给出valuecin

4

3 回答 3

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){};
于 2013-10-19T01:37:23.407 回答
0

两个建议:

1)如下所示声明时初始化“值”,使其不包含随机代码。

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 秒内跳出正确答案。

于 2013-10-19T00:53:07.833 回答
0

您能否检查(或在此处发布)的定义getDegrees (这是可以预期的示例代码)

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

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

Angle::Angle(double deg) : degrees(deg) 
{
}
于 2013-10-19T00:55:41.773 回答