Почему функция-член класса не может принимать более одного аргумента того же типа, что и ее класс

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

Вот код:

class Fraction
{
public:
Fraction(int num=1, int den=1): numerator(num), denominator(den) {}
Fraction(const Fraction& r): numerator(r.numerator), denominator(r.denominator) {}
Fraction& operator=(const Fraction&);
Fraction& operator*(const Fraction&, const Fraction&);
private:
int numerator, denominator;
};

Fraction& Fraction::operator=(const Fraction& r)
{
numerator = r.numerator;
denominator = r.denominator;
return *this;
}

Fraction Fraction::operator*(const Fraction& x, const Fraction& y)
{
Fraction z(x.numerator*y.numerator, x.denominator*y.denominator);
return z;
}

Ниже приведено сообщение об ошибке от компилятора:

Fraction& Fraction::operator*(const Fraction&, const Fraction&)' must take either zero or one argument

2

Решение

Во-первых, проблема, которую вы наблюдаете, не имеет абсолютно никакого отношения к функциям-членам в целом. Функции-члены обычно могут принимать произвольное количество аргументов типа «того же класса». В вашем примере вы можете объявить

class Fraction
{
void foo(Fraction &f1, Fraction &f2, Fraction &f3, Fraction &f4) {}
...
};

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

Во-вторых, в вашем коде речь идет о том простом факте, что вы пытаетесь перегрузить оператор. Синтаксис оператора в C ++ фиксирован для большинства (но не для всех) операторов. Это сразу означает, что те операторы, чей синтаксис является фиксированным, будут иметь фиксированное количество параметров.

В вашем примере это оператор *, Он может быть одинарным (один параметр) или двоичным (два параметра). Когда вы перегружаете этот оператор функцией-членом, уже подразумевается один параметр, поэтому вы можете добавить только ноль или один дополнительный параметр (для одинарного * и двоичный * соответственно). Вы, с другой стороны, пытаетесь добавить два больше параметров в дополнение к неявному. То есть вы пытаетесь определить троичный оператор *, Это невозможно. Там нет троичного * оператор в C ++. И это именно то, что говорит вам компилятор.

1

Другие решения

Операторы принимают фиксированное количество аргументов, например, оператор +, поскольку оператор сложения принимает ровно 2 параметра. Если это функция-член, то подразумевается, что первая (самая левая) этот и второй передается в качестве параметра.

Как будет выглядеть оператор +, который принимает три параметра? Можно представить, что это будет выглядеть 3 + 4 + 5 но это эквивалент вызова оператора + (3,4), а затем оператора + (7,5).

Список операторов и количество аргументов, которые они принимают, можно найти в википедии: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

Для получения более подробной информации есть еще одна публикация StackOverflow, в которой подробно рассказывается: Перегрузка оператора

5

По вопросам рекламы [email protected]