为啥我没有编码时我的班级正在执行算术?

Posted

技术标签:

【中文标题】为啥我没有编码时我的班级正在执行算术?【英文标题】:Why is my class performing arithmetic when I haven't coded any?为什么我没有编码时我的班级正在执行算术? 【发布时间】:2019-05-05 16:44:49 【问题描述】:

我正在做一个家庭作业项目,旨在向我们介绍课程。我刚刚开始,但由于某种原因,我的成员变量一直正确显示到最后。它应该只是在函数之间传递这些变量然后输出它们。它将采用参数化构造函数设置的分子和分母,用它们设置一个对象,然后输出分子和分母所持有的内容。它正在获取分子并将其设置为零,即使它之前在该类运行的每个函数中都显示了正确的数字。分母更奇怪,因为它以某种方式变成了一个巨大的数字。我只是想了解发生了什么,因为我是新手,以及为什么对我来说不是很明显。

#include <iostream>

using std::cout;
using std::endl;
using std::ostream;

class RationalNum

public:
    RationalNum();
    RationalNum(int numer, int denom);
    int getNumerator() const  return numer; 
    int getDenominator() const  return denom; 
    void setNumerator(int);
    void setDenominator(int);
    void set(int& numer, int& denom);
    void output(ostream& outs);

private:
    int denom;
    int numer;
;

RationalNum::RationalNum() : numer(1), denom(1)


RationalNum::RationalNum(int numer, int denom) //takes two integers for numer and denom, and reduces

    cout << "The numer and denom  in the param const are " << numer << denom << endl;
    set(numer, denom);


void RationalNum::set(int& numer, int& denom) //use other functions to take two params and set as numer and denom


    cout << "The numer and denom in set are " << numer << denom << endl;
    setNumerator(numer);
    setDenominator(denom);


void RationalNum::setNumerator(int numer) //takes an int, sets it as numer, and reduces it

    cout << "in setNumer, the numer is: " << numer << endl;
    //reduce(newNumer); //Not using yet


void RationalNum::setDenominator(int denom) //takes an int, sets it as denom, and reduces it

    cout << "in setDenom, the denom is: " << denom << endl;
    //reduce(newDenom); //Not using yet


void RationalNum::output(ostream& outs) //takes an ostream param

    cout << numer << "/" << denom << endl;



int main()

    RationalNum rn1, rn2(25, 10), rn3(24, -100);

    cout << "rn1 contains: ";
    rn1.output(cout);
    cout << endl;

    cout << "rn2 contains: ";
    rn2.output(cout);
    cout << endl;

    cout << "rn3 contains: ";
    rn3.output(cout);

这是实际结果。直到最后两行都是正确的,这就是我迷路的地方。 rn2 应显示 25/10,rn3 应显示 24/-100

The numer and denom  in the param const are 2510
The numer and denom in set are 2510
in setNumer, the numer is: 25
in setDenom, the denom is: 10

The numer and denom  in the param const are 24-100
The numer and denom in set are 24-100
in setNumer, the numer is: 24
in setDenom, the denom is: -100
rn1 contains: 1/1    
rn2 contains: 0/4196160    
rn3 contains: 0/4197376

【问题讨论】:

初始化你的变量。 为什么在default-constructor中使用初始化列表而不在另一个中使用? 另请注意,成员变量名称等于函数参数 (number, denom) 充其量是误导,并且肯定是错误的简单来源 【参考方案1】:

setNumeratorsetDenominator 方法没有做任何事情。由于这个原因,类成员denomnumer 并没有被初始化。因此,它们的值将是未定义的,即可能是垃圾。

要修复它,请使用:

void RationalNum::setNumerator(int n)

  numer = n; // I changed the parameter name to avoid confusion with the member
  cout << "in setNumer, the numer is: " << numer << endl;
  //reduce(newNumer); //Not using yet

对分母使用类似的方法。

【讨论】:

那我该如何解决呢?这些集合函数必须调用 reduce 以将给出的分数减少为最低项,然后返回修改后的变量。在我开始使用 reduce 函数之前,有没有办法让它正确显示? @Maravae 我编辑了答案以包含以提供如何修复它的示例。我只需要一行将参数分配给类成员。

以上是关于为啥我没有编码时我的班级正在执行算术?的主要内容,如果未能解决你的问题,请参考以下文章

为啥绑定源时我的图片不显示?

为啥我的单引号 (') 没有被编码?

GRPC 使用地理编码器失败

算术错误:Python 错误地划分变量

我的keil 4为啥不能改变编码格式?没有那个选项?

在 iPhone 中,我如何知道在使用正向地理编码时我的所有地图注释何时加载?