【问题标题】:Why am I getting a weird answer when I try to check the value of a field?当我尝试检查字段的值时,为什么会得到一个奇怪的答案?
【发布时间】:2013-10-19 00:38:50
【问题描述】:

我在 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,这绝对不是我通过cinvalue 提供的。

【问题讨论】:

  • Angle.h 是什么样的,Angle.cpp 的其余部分是什么样的?
  • 您发布的代码本质上没有任何问题。如果您的“cin”输入无法正确解析为双精度(例如,文本字符串而不是数字),您会得到奇怪的结果。要么,要么您在未显示的代码中犯了一些错误。
  • 在将value 的值发送给构造函数验证输入是否正确之前,您是否尝试过std::cout
  • 确保cin 正确解析它,如前所述。另外,您是否使用了 Angle 对象的不同实例?

标签: c++ object parameters field


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      两个建议:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        • 2015-12-15
        • 2015-04-28
        • 2018-11-07
        • 1970-01-01
        • 2015-08-09
        相关资源
        最近更新 更多