我正在尝试理解重载->运算符的工作原理。我有以下类:
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*
类型。因此,在主方法中调用messageWrapper->
时返回的是一个Message*
类型指针。通常情况下,当有一个指针时,需要使用->
操作符或解引用操作符来访问对象。
根据这个逻辑,要访问Message
对象的m_text
变量,代码应该写成以下形式。(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";
我不理解这里的逻辑,请您给予一些解释。
==============
进一步的说明:
在主方法中,我看到以下两个方法执行了相同的操作。
messageWrapper.operator->()->m_text = "JKH";
messageWrapper->m_text = "JKH";
这是否意味着操作符
->
与其他操作符的工作方式不同,其中它的意思是messageWrapper->
相当于 (messageWrapper.operator->())->
而不是 messageWrapper.operator->()
,这是其他操作符的情况。
*(messageWrapper->).m_Text
语法错误。 - Jabberwocky