Я пишу свой собственный класс массива в качестве упражнения. Поскольку я читаю функции, не являющиеся членами, на самом деле они лучше, чем функции-члены.
(Скотт Мейерс)
Я пытаюсь написать как можно больше перегрузок операторов, чем функции, не являющиеся членами.
Оператор перегружает +, — все отлично работает как функции, не являющиеся членами.
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 и вызывал перегрузки, они должны быть реализованы как функция-член.
Мои рассуждения верны? Если нет, то как мне реализовать это как функцию, не являющуюся членом?
Спасибо за предоставленную мне некоторую информацию.
Возможно, я неправильно понял, но если вы боретесь с правильным объявлением обоих операторов, вы все равно можете сделать это с помощью свободных операторов, таких как члены. Вы, однако, должны пройти объект в качестве первого параметра по ссылке. Вы правы в том, что как функции-члены они получают свой объект бесплатно через этот. В качестве бесплатной функции, вы должны нажать ее самостоятельно.
#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.
Других решений пока нет …