为什么我的会员功能不起作用?

时间:2014-02-12 10:35:29

标签: c++ function error-handling

我正在为我的计算机程序类编写一个计算机程序,但出于某种原因,由于涉及我的成员函数的错误,我无法运行我的程序。我一直收到错误消息

“错误错误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) 

3 个答案:

答案 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>