Реализация сематики указателя (прокси класс)
class MyObject
{
public:
void foo() {}
};
class MyObjectPtr // Так называемый PROXY класс
{
MyObject* ptr_;
public:
MyObjectPtr()
: ptr_(new MyObject())
{
}
~MyObjectPtr()
{
delete ptr_;
}
MyObject* operator->()
{
return ptr_;
}
};
MyObjectPtr p;
p->foo();
Здесь оператор -> возвращает указатель на MyObject и после вызываем функцию foo(). Однако, мне кажется было бы логичнее, если бы вызов функции выглядел вот так:
(p->)->foo();
Разве нет? Сначала мы получаем указатель, а после происходит обращение через указатель к функции класса.
Или я чего-то не понимаю.
Ответы (2 шт):
Что такое "семантика указателя"? Это когда объект выглядит как указатель.
То есть ваш MyObjectPtr p; должен вести себя как указатель:
p->foo();
да, Вы верно описываете функциональность класса MyObjectPtr. Оператор -> возвращает указатель на MyObject и вы можете вызывать функцию foo() у этого указателя.
НО, выражение (p->)->foo() не будет работать, поскольку p-> уже возвращает указатель на MyObject, а не другой указатель. Поэтому вызов функции foo() должен выглядеть как p->foo().