【问题标题】:My program is crashing, I can't find why我的程序崩溃了,我找不到原因
【发布时间】:2016-07-04 11:14:33
【问题描述】:

我编写了一个程序来用 C++ 实现分数。我之所以做到这一点,是因为这是我在家里学习的 C++ 课程中的一种家庭作业。该程序可以编译,但在启动后会很快崩溃。我自己搜索了一个答案,我发现它在创建新对象时崩溃了。这是错误的代码。

//a and b are for the numerators and denominator in the fraction: a/b
ZFraction::ZFraction(int numer, int denom):m_numer(numer), m_denom(denom)//this constructor made it crash
{
    if(m_numer != 0)
    {
        m_numer = m_denom % m_numer;
        m_denom = m_denom/m_numer;
    }
    else
    {
        cout << "Fraction impossible";
    }
} 

为什么会崩溃?提前致谢。

【问题讨论】:

  • 你检查了错误的值为零,它是m_a 不能为零。零可以除以任何东西,但什么都不能被零除。
  • @Jägermeister 您似乎倒退了; m_am_b 是班级成员。 ab 是参数,仅用于初始化成员。在这方面一切都很好。
  • 你需要复习你童年数学书中关于分数的部分。这不是你简化分数的方式。
  • @Angew Uups。感谢您的澄清。
  • 不,不要发布完整的项目。您必须做一些工作来隔离问题。

标签: c++ methods crash


【解决方案1】:

m_numer 的值会在各个部分之间发生变化。例如,如果您有denom = 20numer = 10,则该行

m_numer = m_denom % m_numer

分配m_numer = 0。然后在计算m_denom 时除以零。我建议使用原始值进行计算,即

ZFraction::ZFraction(int numer, int denom):m_numer(numer), m_denom(denom)
{
    if(numer != 0)
    {
        m_numer = denom % numer;
        m_denom = denom/numer;
    }
    else
    {
        cout << "Fraction impossible";
    }
}

顺便说一句,考虑抛出异常而不是写在 cout 上,这样如果numer == 0,您将不会有一个具有虚假值的构造对象。

另外,分子是分数顶部的名称,而不是底部的名称。

【讨论】:

  • 谢谢,这就是问题所在。
  • 如果它对您有所帮助,如果您将答案标记为已接受,我将不胜感激,这样其他人就不必花时间在似乎未解决的问题上。
猜你喜欢
  • 2011-11-14
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
相关资源
最近更新 更多