【发布时间】:2019-05-14 10:19:38
【问题描述】:
我试图了解重载 -> 运算符的工作原理。我有以下课程
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*。通常当我有一个指针的时候,我需要使用-> 操作符或者deference 操作符来访问对象。
按照这个逻辑,要访问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";
我不明白这里的逻辑。请让我澄清一下。
==============
一些进一步的说明:
在 main 方法中我看到下面两个方法做同样的事情
messageWrapper.operator->()->m_text = "JKH";
messageWrapper->m_text = "JKH";
这是否意味着运算符-> 与其他运算符的工作方式不同
messageWrapper-> 等价于(messageWrapper.operator->())->
而不是 messageWrapper.operator->() 就像其他运营商的情况。
【问题讨论】:
-
*(messageWrapper->).m_Text语法错误。 -
您能解释一下原因吗?这就是我不明白的。 (messageWrapper->) 是一个指向消息的指针。取消引用访问对象的指针应该是 (messageWrapper->)-> 或 *(messageWrapper->)
-
[overloading-member-access-operators-c][1] 的可能副本。 [1]:stackoverflow.com/questions/8777845/…