使用类中的值设置等于新值而不更改先前值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
变量,这一切都可以通过普通的流输出运算符<<
来完成。
另外,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->
是不必要的,因为范围解析运算符 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 ++的主要内容,如果未能解决你的问题,请参考以下文章