我正在为我的计算机程序类编写一个计算机程序,但出于某种原因,由于涉及我的成员函数的错误,我无法运行我的程序。我一直收到错误消息
“错误错误C3490:'den'无法修改,因为它是通过const对象访问的”
我收到此消息的错误是什么?如何更正?
这是我的代码:
// implement all class member functions here, gcd function is given
int Fraction::gcd()
{
if(num == 0) return 1;
int a = max(abs(num), abs(den));
int b = min(abs(num), abs(den));
while(b != 0)
{
int result = a%b;
a = b;
b = result;
}
return a;
}
void Fraction::input(istream& in)
{
char op;
in >> num;
in >> op;
in >> den;
if(den == 0)
{
cout << "Wrong input. Exit the program" << endl;
exit(1);
}
if(den < 0)
{
num *= -1;
den *= -1;}
}
void Fraction::output(ostream& out)
{
if(den == 0)
out << "0";
else
out << num << " / " << den;
}
Fraction::Fraction(int numerator, int denominator)
{
assert(denominator !=0);
num = numerator;
den = denominator;
if(den < 0)
{
num *=-1;
den *= -1;
}
}
bool Fraction::less(const Fraction& other) const
{
Fraction temp(other.num , other.den);
int num_1(num);
if(den != temp.den)
{
num_1 *= temp.den;
temp.num *= num;
}
if(num_1 < temp.num)
{return true;}
else
{return false;}
}
Fraction Fraction::reciprocal() const
{
Fraction tempa(num, den);
int temp(tempa.num);
tempa.num = tempa.den;
tempa.den = temp;
num = den;
if(den < 0)
{
num *= -1;
den *= -1;
}
return tempa;
}
Fraction Fraction::neg() const
{
num*=-1;
return;
}
Fraction::Fraction(int numerator)
{
num = numerator;
den = 1;
}
Fraction::Fraction()
{
num = 0;
den = 1;
}
Fraction Fraction::add(const Fraction& other) const
{
int num_1 = num *other.den;
int num_2 = den*other.den;
int denom = den*other.den;
Fraction result((num_1+num_2), denom);
result.reduce();
return result;
}
Fraction Fraction::div(const Fraction& other) const
{
Fraction temp(num, den);
other = other.reciprocal();
Fraction result(temp.mul(other));
return result;
}
Fraction Fraction::sub(const Fraction& other) const
{
int num_1 = num *other.den;
int num_2 = den*other.den;
int denom = den*other.den;
Fraction result((num_1-num_2), denom);
result.reduce();
return result;
}
Fraction Fraction::mul(const Fraction& other) const
{
int num_0 = num*other.num;
int denom = den*other.den;
Fraction result(num_0, denom);
result.reduce();
return result;
}
void Fraction::reduce()
{
int r = gcd();
num /= r;
den /= r;
if(num == 0)
den = 1;
}
bool Fraction::less_or_equal(const Fraction& other) const
{
}
bool Fraction::greater_or_equal(const Fraction& other) const
{
}
bool Fraction::equal(const Fraction& other) const
{
}
bool Fraction::not_equal(const Fraction& other) const
{
}
bool Fraction::greater(const Fraction& other)
答案 0 :(得分:2)
您正在尝试在const方法中修改名为“den”的成员,并且您无法在const内部修改任何内容,只需访问数据即可。您将需要修改您的函数以摆脱const或复制它而不使用const。
您的代码很难阅读,但这似乎发生在您的“互惠()”方法中。
答案 1 :(得分:1)
使用const限定符声明的成员函数可能不会更改基础对象。例如,函数reciprocal用限定符const
声明 Fraction Fraction::reciprocal() const
{
Fraction tempa(num, den);
int temp(tempa.num);
tempa.num = tempa.den;
tempa.den = temp;
num = den;
if(den < 0)
{
num *= -1;
den *= -1;
}
return tempa;
}
并在其内部尝试修改变量den
if(den < 0)
{
num *= -1;
den *= -1;
}
如果您希望使用const限定符的函数可以更改数据成员den,则应将其定义为可变。例如
mutable int den; // denominator of the fraction
虽然重新设计会员功能会更好。
答案 2 :(得分:1)
“错误错误C3490:'den'无法修改,因为它是通过const对象访问的”
正是它所说的:在用const标记的成员函数中,你试图改变成员变量的值。你已经完成了几次我能看到的事情。查看方法Fraction :: reciprocal(),例如:
Fraction Fraction::reciprocal() const // NOTE: CONST METHOD
{
Fraction tempa(num, den);
int temp(tempa.num);
tempa.num = tempa.den;
tempa.den = temp;
num = den;
if(den < 0)
{
num *= -1;
den *= -1; // NOTE: ATTEMPT TO MODIFY den, WHICH IS CONST
}
}
您的编译器应该告诉您它抱怨的实例的确切行号。一种解决方案是从相关函数中删除const
说明符。
但是,如果den
不是“逻辑状态”的一部分(即它是缓存值或其他中间值),那么将变量声明为mutable
通常是可以接受的。 / p>