使用类中的值设置等于新值而不更改先前值c ++

Posted

技术标签:

【中文标题】使用类中的值设置等于新值而不更改先前值c ++【英文标题】:Using a value in a class to set equal to a new value without changing previous value c++ 【发布时间】:2020-10-18 07:52:31 【问题描述】:

我正在使用有理数的类结构。我试图基本上将 r2 值用于 num 和 den (分子和分母),并让它们为负并等于 r3。而 r3.output(cout, "r3") 应该输出 r3:4/1。

代码的当前输出(当我删除 r3 时): r1:10/3 r2 = -4/1

我无法掌握如何从本质上返回类数据以将 r3 的值设置为等于负 r2 的值。我必须使用 int 主命令,所以不能更改。

谢谢,这是我第一次真正的上课,所以会很乱。请忽略其他操作数,我还没有讲到。

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

class rational 
    int num,den,nummod,denmod;
public:
    rational (int,int); //Constructor
    int gcd (int n1 ,int n2); //Finds GCD
    int simplified(int x, int y,int z); //Simplifies the fraction
    //IO
    int input();
    void output(ostream& y, string label); //Outputs the fraction

    //Expressions
    int neg(void);

    rational &sub();
    rational &add();
    rational &mul();
    rational &div();

;

rational::rational(int x,int y)

    if(y == 0) //make it throw a cerr error and exit with -1.
    
        cout<<"0 in denominator error"<<'\n';
        return;
    
    int z = gcd(x,y);
    simplified(x,y,z); //Gets the simplified numerator and denominator
    return;

int rational::simplified(int x, int y, int z) 
    num = x/z;
    den = y/z;
    return 1;


int rational::gcd(int n1, int n2)  //Code provided by the homework
    int tmp;
    while (n2 != 0) 
        tmp = n1;
        n1 = n2;
        n2 = tmp % n2;
    


void rational::output(ostream &y, string label) 
    if(cout)
    
        string fraction = to_string(num) + "/" + to_string(den);
        cout<<label<<": "<<fraction<<'\n';
        return;
    
    //if()
    //
    //    return;
    //


int rational::neg(void) r2.neg();
    int temp;
    if (num < 0) 
        num =num * -1;
    
    if (den < 0) 
        den =den * -1;
    
    return 0;



int main(void)

    rational r1(10, 3);
    rational r2(8, -2);

    r1.output(cout, "r1");
    r2.output(cout, "r2");
    rational r3 = r2.neg();  //This is the error
    r3.output(cout, "r3");

    return 0;

【问题讨论】:

鉴于你使用这个 neg 函数的方式,它应该返回一个新的有理实例,而不是一个 int。 gcd 函数中的输出不会发生,就像你之前的 return 一样。与r2.neg(); 相同,该语句也不会发生。 而在output函数中,如果不使用y参数有什么作用呢?而且我认为该函数中不需要临时的fraction 变量,这一切都可以通过普通的流输出运算符&lt;&lt; 来完成。 另外,r2.output(cout, "r3");,但“标签”("r3") 具有误导性,因为它是用于输出的 r2 对象。 哦,什么是 例如r2 在您的某些功能中?你似乎忘记了一些关于范围界定的课程。您显示的代码不会构建,更不用说运行并产生您声称的输出。请花一些时间刷新the help pages,阅读SO tour,阅读How to Ask,以及this question checklist。并且不要忘记如何创建一个合适的minimal reproducible example 向我们展示。 【参考方案1】:

你永远不会初始化 r3。它可能应该发出警告(可能带有 -Wextra g++ 标志或类似的东西)。正如 Botje 所提到的,一种选择是将 neg() 编码为 Rational 对象的构造函数,该对象引用被否定的 Rational 对象。

另一种选择是将 neg() 编码为 void 函数,它只是否定调用它的列表(例如,r2.neg() 否定 r2)。这仍然需要一种使 r3 成为 r2 的副本的方法。

最后,neg() 函数中的 this-&gt; 是不必要的,因为范围解析运算符 rational:: 会将您置于访问该(成员函数)所需的范围内

【讨论】:

遗憾的是,我无法初始化 r3,因为我必须从整个 main 开始。无论如何我无法编辑它。我为 neg() 做了 void 函数,我将如何制作从 r2 到 r3 的副本?这里主要是确保 r2 不会被 r3 覆盖。谢谢 在 main r1 和 r2 中,由构造函数初始化。正如其他评论者提到的那样。如果您根本无法更改此 main 则 neg 将不得不返回一个 Rational 对象。查找复制构造函数。也可能是复制粘贴错误,但是当您输入 neg 时发生的第一件事是您再次调用 neg .. 如果运行它会循环直到递归堆栈溢出 是的,这是一个复制粘贴错误,即使它不在我的源代码中。无论如何,我更新了原来的帖子来解决这个问题。我如何让它返回一个理性的对象?我试过了,但它仍然给了我一个转换为非标量类型的错误。谢谢 查看这篇关于复制构造函数的文章:tutorialspoint.com/cplusplus/cpp_copy_constructor.htm

以上是关于使用类中的值设置等于新值而不更改先前值c ++的主要内容,如果未能解决你的问题,请参考以下文章

Python 3:检查迭代器的下一个值而不进行迭代

PyQt/Pyside - 也使用 valueChanged 返回先前的值

如何在sqlalchemy中的值更改后触发事件

C ++将char值设置为字符串?

NuxtJs 从 jquery 更改的输入中获取值

Pandas:更改通过列中的布尔索引选择的值而不会收到警告