У меня есть простая реализация интеллектуального указателя, показанная во фрагменте кода 1 ниже. И фиктивный тестовый класс с именем Dummy во втором фрагменте. Фрагмент кода 3 показывает, как мы можем использовать этот простой интеллектуальный указатель для доступа к функции foo().
Мой вопрос о том, как мы вызываем функцию foo() в классе Dummy с помощью оператора ->. -> оператор уже возвращает указатель на необработанный указатель. Итак, я думаю, чтобы мы могли вызвать функцию foo(), нам нужно выполнить вторую операцию -> над возвращенным необработанным указателем. Однако во многих источниках говорится, что достаточно просто одного использования оператора ->.
Вкратце, я думаю, что правильный вызов должен выглядеть следующим образом: (dummy->)->foo();
Однако такой вызов dummy->foo() работает нормально. Может кто-нибудь объяснить мне, почему (dummy->)->foo() неверен? Возможно, у меня есть концептуальное непонимание, но я хотел бы знать концепцию правильно.
ФРАГМЕНТ КОДА 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; }
};
ФРАГМЕНТ КОДА 2 (фиктивный класс)
class Dummy
{
public:
foo() {......}
};
ФРАГМЕНТ КОДА 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();
a->b
определяется как(*a).b
(для неперегруженных->
), поэтому(dummy->)->func()
будет определяться как(*((*dummy).)).func()
, что является нонсенсом. - person dyp   schedule 15.11.2013