【问题标题】:How do i use hidden *this pointer?如何使用隐藏的 *this 指针?
【发布时间】:2026-01-15 00:15:01
【问题描述】:

我有这个代码:

class Something
{
private:
    int m_value = 0;
public:
    Something add(int value)
    {
        m_value += value;
        return *this;
    }
    int getValue()
    {
        return m_value;
    }

};

int main()
{
    Something a;
    Something b = a.add(5).add(5);
    cout << a.getValue() << endl;
    cout << b.getValue() << endl;
}

输出:

5
10

我想让add() 返回a 对象,这样第二个add() 就像(*this).add(5),但这不起作用。但是,b 很好(怎么样?)。我预计a 为 10,与b 相同。

那么,我在哪里错过了隐藏指针的使用?我应该怎么做才能使a.add(5).add(5)am_value 更改为10?

【问题讨论】:

  • 究竟是什么不起作用?你期望的输出是什么?
  • 这个问题应该包含更多细节并澄清问题。
  • add 返回Something 实例的副本。您的下一个调用链会修改该临时副本。你想从add返回Something&amp;吗?
  • Something&amp; 评论是一个合理的猜测,但不幸的是我们正在猜测。您的代码不是将5 添加到a 吗? b 不会被分配另一个5 的值吗?你的输出是正确的,你没有解释什么“不起作用”。

标签: c++ this method-chaining


【解决方案1】:

add() 正在返回*this 按值,因此它返回了*this副本,因此链接的add() 正在修改副本,不是原版。

add() 需要返回*this 引用

Something& add(int value)
{
    m_value += value;
    return *this;
}

更新: a 最初将m_value 设置为0,然后a.add(5)a.m_value 设置为5,然后返回a副本 .然后&lt;copy&gt;.add(5)&lt;copy&gt;.m_value 设置为10 并返回另一个副本,然后将其分配给b。这就是为什么你看到a 是 5 而b 是 10。

【讨论】: