Перегрузка постфиксного / префиксного оператора c ++ как функция, не являющаяся членом

Я пишу свой собственный класс массива в качестве упражнения. Поскольку я читаю функции, не являющиеся членами, на самом деле они лучше, чем функции-члены.
(Скотт Мейерс)

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

my_array operator+(const my_array & left, const my_array & right);
my_array operator-(const my_array & operand);
my_array & operator++();  // prefix
my_array   operator++(int); //postfix, compiler puts a 0

Однако операторы префикса / постфикса как функции, не являющиеся членами, создают проблемы (они отлично работают, если я использую разрешение области действия и делаю их функциями-членами)

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

: 'my_array& operator++()' must have an argument of class or enumerated type

Что в принципе может быть решено, если я сделаю их членами-функциями и разрешу передать * этот массив obj в следующем формате.

(*this).operator++();

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

Я пришел к выводу, что, поскольку postfix / prefix является унарным оператором
у них только один аргумент (обычно * это).
Итак, если я хочу, чтобы компилятор неявно предоставлял указатель * this и вызывал перегрузки, они должны быть реализованы как функция-член.

Мои рассуждения верны? Если нет, то как мне реализовать это как функцию, не являющуюся членом?
Спасибо за предоставленную мне некоторую информацию.

2

Решение

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

#include <iostream>

struct my_array
{
// your members here.
};

my_array& operator ++(my_array& obj)
{
// access to members is through obj.member
std::cout << "++obj called." << std::endl;
return obj;
}

my_array operator ++(my_array& obj, int)
{
my_array prev = obj;

// modify obj, but return the previous state.
std::cout << "obj++ called." << std::endl;

return prev;
}

int main(int argc, char *argv[])
{
my_array obj;
++obj;
obj++;
return 0;
}

Выход

++obj called.
obj++ called.
2

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

Других решений пока нет …

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