Перегрузка оператора 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*
вызвать функцию.
Как это исправить?
Вопрос "что если": если бы не указанная выше ошибка компилятора, тогда определение функции было бы круглым и некорректным, так как оно пытается определить
unary operator*
наA*
осуществляяunary operator*
наA*
? Есть ли способ снять цикличность этого определения, например, как перегруженoperator new
можно избежать кругового определения, возвращая глобально::operator new(size_t size)
? Есть ли глобальный оператор разыменования и::*
синтаксис для этого?