Реализация сематики указателя (прокси класс)

Рейтинг: 0Ответов: 2Опубликовано: 13.02.2023
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();

Разве нет? Сначала мы получаем указатель, а после происходит обращение через указатель к функции класса.
Или я чего-то не понимаю.

Ответы

▲ 1

Что такое "семантика указателя"? Это когда объект выглядит как указатель.

То есть ваш MyObjectPtr p; должен вести себя как указатель:

p->foo();
▲ 0

да, Вы верно описываете функциональность класса MyObjectPtr. Оператор -> возвращает указатель на MyObject и вы можете вызывать функцию foo() у этого указателя.

НО, выражение (p->)->foo() не будет работать, поскольку p-> уже возвращает указатель на MyObject, а не другой указатель. Поэтому вызов функции foo() должен выглядеть как p->foo().