Перегрузка оператора Derference

C++

Увидев, что оператор разыменования перегружен для целей, отличных от разыменования указателя на объект, я хочу проверить, как перегрузить оператор разыменования (в основном) с целью разыменования указателя на объект. Я хочу перегрузить оператор разыменования для struct A дать тот же эффект, что и у обычного оператора разыменования, плюс дополнительный эффект распечатывания сообщения при каждом его вызове. Я хочу, чтобы перегруженный оператор использовался точно так же, как и обычный оператор разыменования, как в:

int x = 2;
int* iptr = x;
cout << *iptr << endl;

Так же, как один * разыменовывает iptr дать доступ к int я хочу ровно одну * разыменовать A* дать доступ к A pointee. Я не думаю, что перегрузка должна быть функцией-членом, так как это потребует использования * на A объект, а не на A*, чтобы вызвать вызов. С функцией-членом мне нужно использовать две разыменования на A* просто чтобы запустить метод перегрузки оператора (первым разыменовывается A* чтобы получить доступ к A объект, а второй для фактического вызова).

friend декларация приходит на ум. Я хотел бы сделать это:

#include <iostream>

struct A
{
    friend A& operator*(A* aptr);
};

A& operator*(A* aptr)
{
    std::cout << "operator*\n";
    return *aptr;
}

int main()
{
    A a;
    A* aptr = &a;
    *aptr;
}

Но VC11 дает error C2803: 'operator *' must have at least one formal parameter of class type, Прототип функции будет скомпилирован с A& или же A как тип параметра, но это вернуло бы меня к проблеме необходимости двух разыменований на A* вызвать функцию.

  1. Как это исправить?

  2. Вопрос "что если": если бы не указанная выше ошибка компилятора, тогда определение функции было бы круглым и некорректным, так как оно пытается определить unary operator* на A* осуществляя unary operator* на A*? Есть ли способ снять цикличность этого определения, например, как перегружен operator new можно избежать кругового определения, возвращая глобально ::operator new(size_t size)? Есть ли глобальный оператор разыменования и ::* синтаксис для этого?

0 ответов

Другие вопросы по тегам