2016-02-24 2 views
-9

У меня есть следующий кодированный перегрузка оператора:Перегруженный оператор - предупреждение: утверждение не имеет никакого эффекта [-Wunused значение]

Clase &operator*(Clase const & n){ 
    coeficiente_*n.coeficiente_; 
    grado_*n.grado_; 
    return *this; 
} 

При компиляции я получаю следующее предупреждение:

clase.hpp:62:18: warning: statement has no effect [-Wunused-value] 
     coeficiente_*n.coeficiente_; 
       ^

Что предупреждение означает? Как это решить?

+2

Что неясно, о том, что предупреждение? Вам нужно хранить результаты умножений где-то, иначе есть _no effect_. –

+4

Что вы ожидаете от умножения двух чисел вместе, кроме умножения двух чисел вместе? (запрет перегрузки оператора) – TartanLlama

ответ

0

Ваши заявления

coeficiente_*n.coeficiente_; 
grado_*n.grado_; 

не имеют никакого эффекта. Они будут такими же, как написание

5; 
24; 
"123"; 

Perhapts вы хотели сделать, как

присваивания
coeficiente_ *= n.coeficiente_ 
grado_ *= n.grado_; 

?

1

Компилятор предупреждает вас, что coeficiente_*n.coeficiente_ и grado_*n.grado_ не действуют. Для того чтобы они имели эффект, результат должен быть присвоен чем-то. Для примера предположим тип int;

int c = coeficiente_*n.coeficiente_; 
int g = grado_*n.grado_; 

форма оператора не выглядит правильно либо, учитывая OP и;

Clase a, b; 
// initialise as required 
c = a * b; 

Умножение изменит a и результат c будет такой же, как a; поскольку оператор, как указано, выглядит как метод-член, и результат возвращается ссылкой (this). Возможно, это не намерение operator*.

Есть two alternatives to this, укажите operator* как функцию, не являющуюся членом (возможно, с разрешением friend) или возвратите новый объект из метода-члена.

Clase operator*(Clase const & n) /*const*/ 
{ 
    Clase result; // assumption is their is a default constructor for this example 
    result.coeficiente_ = coeficiente_ * n.coeficiente_; 
    result.grado_ = grado_ * n.grado_; 
    return result; 
} 

Способ элемент также может быть помечен как требуется const/желательно.

Реализация, не являющееся членом, может выглядеть (я сохранил большую часть реализации для сравнения):

Clase operator*(Clase const & l, Clase const & r) 
{ 
    Clase result; 
    result.coeficiente_ = l.coeficiente_ * r.coeficiente_; 
    result.grado_ = l.grado_ * r.grado_; 
    return result; 
} 
Смежные вопросы