-> использование в умных указателях
У меня есть простая реализация интеллектуального указателя, показанная во фрагменте кода 1 ниже. И фиктивный тестовый класс с именем Dummy во втором фрагменте. Фрагмент кода 3 показывает, как мы можем использовать этот простой умный указатель для доступа к функции foo ().
Мой вопрос о том, как мы вызываем функцию foo () в классе Dummy с помощью оператора ->. Оператор -> уже возвращает указатель на необработанный указатель. Поэтому, я думаю, для того, чтобы мы могли вызывать функцию foo (), нам нужно выполнить вторую операцию -> с возвращенным необработанным указателем. Тем не менее, многие ресурсы говорят, что одного использования оператора -> достаточно просто.
Вкратце, я думаю, что правильный вызов должен выглядеть следующим образом: (dummy ->) -> foo ();
Тем не менее, вызов как этот dummy-> foo () работает нормально. Может кто-нибудь объяснить мне, почему (dummy ->) -> foo () неверно? Возможно, у меня есть концептуальное недоразумение, но я хотел бы знать концепцию правильно.
КОД SNIPPET 1 (класс SMART POINTER)
template <typename T>
class SmartPointer
{
private:
T* mRawPointer;
public:
SmartPointer(T* thePointer) : mRawPointer(thePointer) {}
~SmartPointer() { delete mRawPointer;}
T& operator* () const { return *mRawPointer; }
T* operator-> () const { return mRawPointer; }
};
КОД SNIPPET 2 (Класс манекен)
class Dummy
{
public:
foo() {......}
};
КОД SNIPPET 3 (ЗАКОНОДАТЕЛЬНЫЕ АЛЬТЕРНАТИВЫ В ВОПРОСЕ)
SmartPointer<Dummy> dummy(new Dummy());
(dummy->)->func();
//I think the above is correct cause we need to make a second dereference on the
//returned raw pointer
//OR
dummy->func();