Я пытаюсь понять, как работает перегрузка -> оператор.У меня есть следующие классы
class Message {
public:
Message(string message) :m_text(message) {}
void printText() {
cout << "text is " << m_text << endl;
}
string m_text;
};
class MessagePointerWrapper
{
public:
MessagePointerWrapper(string message) {
m_message = std::make_unique<Message>(message);
}
Message* operator->() {
return m_message.get();
}
std::unique_ptr<Message> m_message;
};
int main(int argc, char** argv)
{
MessagePointerWrapper messageWrapper = MessagePointerWrapper("Hello World");
messageWrapper.m_message->printText();
messageWrapper->m_text = "PQR";
messageWrapper.m_message->printText();
}
Оператор ->
класса MessageWrapper
перегружен, чтобы вернуть Message*
.Так что в методе main, когда я вызываю messageWrapper->
, он возвращает Message*
.Обычно, когда у меня есть указатель, мне нужно использовать оператор ->
или оператор deference для доступа к объекту.Согласно этой логике, чтобы получить доступ к m_text
проверяемому объекту Message
, код должен быть написан следующим образом:
(messageWrapper->) // this returns a pointer to Message. so to access the object, I should write as
(messageWrapper->)->m_text = "PQR"
или
*(messageWrapper->).m_Text = "PQR"
, но это не работаеттаким образом, и мне нужно назвать это
messageWrapper->m_text = "PQR";
Я не понимаю логику здесь.Могу ли я получить разъяснения по этому вопросу, пожалуйста.
==============
Некоторые дополнительные примечания:
В основном методе Iвидел, как два приведенных ниже метода делают одно и то же
messageWrapper.operator->()->m_text = "JKH";
messageWrapper->m_text = "JKH";
означает ли это, что оператор ->
работает не так, как другие операторы, где это означает, что
messageWrapper->
эквивалентно (messageWrapper.operator->())->
ине messageWrapper.operator->()
, как в случае других операторов.