2014-02-12 3 views
-1

Я пишу компьютерную программу для своего компьютерного программного класса, но по какой-то причине я не могу запустить свою программу из-за ошибки, связанной с моими функциями-членами. Я получаю сообщение об ошибкеПочему моя функция-член не работает?

«Ошибка Ошибка C3490:„логово“не может быть изменен, поскольку доступ к нему осуществляется через константный объект»

Что я сделал не так, чтобы получить это сообщение и как я могу это исправить ?

Это мой код:

// 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

Пожалуйста, удалите любой ненужный код и соответствующим образом отформатируйте его. – olevegard

+1

Как говорится в сообщении, вы пытались изменить 'den' через объект' const'. Это именно то, что вы сделали неправильно. Есть ли что-то непонятное в отношении вышеизложенного? (Примеры ответов: Я не знаю, что такое «изменить», я не знаю, что такое «const», я не знаю, какой объект const, я не знаю, почему это неправильно). –

ответ

2

Вы пытаетесь изменить элемент с именем «логово» в константный метод, и вы не можете изменить ничего внутри константной, просто получить доступ к данным. Вам нужно будет изменить свою функцию, чтобы избавиться от const или дублировать ее без константы.

Ваш код трудно прочитать, но это, похоже, происходит в вашем «обратном()» методе.

+1

Или объявите член 'mutable' – olevegard

+3

И это также происходит с элементом' num'. И решение заключается не в том, чтобы сделать их неконстантными, а члены изменчивыми. Посмотрите на функции. Предполагается, что они возвращают ценность-результат вычисляемого результата, а не мутируют существующий объект. По крайней мере, некоторые из них. – WhozCraig

+0

Конечно, это относится ко всем переменным внутри класса. –

1

Функции-члены, объявленные с помощью спецификатора 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; 
    } 

и внутри себя он пытается изменить переменные Денут

if(den < 0) 
{ 
num *= -1; 
den *= -1; 
} 

Если вы хотите, чтобы функции с константным спецификатором могут изменить элемент данных логова вы должны определить его как изменчивый. Например,

mutable int den; // denominator of the fraction 

Хотя было бы лучше реорганизовать ваши функции-члены.

1

«Ошибка Ошибка C3490:„логово“не может быть изменен, поскольку доступ к нему осуществляется через константный объект»

Именно то, что он говорит: в функции члена обозначенному сопзЬ, вы пытались для изменения значения переменной-члена. Вы делали это пару раз, что я вижу. Посмотрите на метод фракции :: взаимными(), например:

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.

Смежные вопросы