2015-12-05 3 views
0

Так я пытаюсь перегрузить оператор * поэтому оба способа будут работать:C++ простой оператор перегрузки для обоих направлений

Myclass * a; 
a * Myclass; 

Когда я объявляю эту функцию все идет хорошо:

Polynomial operator*(const double d); 

Но когда Я стараюсь сделать это в другом направлении:

Polynomial operator*(Polynomial &, const double d) 

Я получаю сообщение об ошибке: «слишком много параметров для этой оперы тор.

Что я делаю неправильно?

Спасибо!

+2

Попробуйте использовать [глобальный оператор] (http://stackoverflow.com/questions/1145022/difference-between- глобальный оператор и члены-оператор). – MikeCAT

+0

Это не настоящий код. Хотя можно угадать, что происходит, хороший вопрос предоставит достаточно информации, чтобы люди не могли догадаться. –

+0

@PeteBecker У меня, очевидно, была проблема с замедлением, не хотелось путать людей со слишком большим количеством строк кода для чего-то такого простого. – Gil

ответ

1

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

Но если вы используете глобальную функцию, не являющуюся членом, вы можете легко получить какой бы заказ вы ни пожелали. Например

class Polynomial { ... }; 

// Function that allows poly * 12.34 
Polynomial operator*(const Polynomial& lhs, const double rhs) 
{ 
    ... 
} 

// Function which allows 12.34 * poly 
Polynomial operator*(const double lhs, const Polynomial& rhs) 
{ 
    ... 
} 

И если вы не хотите, чтобы переопределить один и тот же код в обеих функциях, и оператор commutative (например, умножение и сложение должно быть), то вы можете реализовать одну из функции, вызвав другой :

Polynomial operator*(const Polynomial& lhs, const double rhs) 
{ 
    ... 
} 

Polynomial operator*(const double lhs, const Polynomial& rhs) 
{ 
    return rhs * lhs; // Calls the operator function above 
} 

конечно, оператор принимает Polynomial объект, как с левой стороны, конечно, может быть реализован в виде функции-члена.

Относительно примечания, если вы реализовали оператор как функцию-член, например.

class Polynomial 
{ 
    ... 

    Polynomial operator*(const double rhs) 
    { 
     ... 
    } 
}; 

следующий код

Polynomial poly1(...); 
Polynomial poly2 = poly * 12.34; 

равен

Polynomial poly1(...); 
Polynomial poly2 = poly.operator*(12.34); 
+0

Приветствия! Замечательный ответ, помог много! – Gil

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