为什么这种链接方法不起作用?

时间:2012-08-17 19:04:15

标签: c++

这是一个简单的计数器。正在调用方法add以将私有变量count默认增加1。我从函数中返回Counter类,以便它可以被链接,但是当我查看输出时,当我期望它为3时它会给我1,因为我调用了add三次。

#include <iostream>
#include <vector>

using std::cout;

class Counter {
    public:
        Counter() : count(0) {}

        Counter add() {
            ++count; return *this;
        }

        int getCount() {
            return count;
        }
    private:
        int count;
};

int main() {

    Counter counter;

    counter.add().add().add();

    cout << counter.getCount();

}

1 个答案:

答案 0 :(得分:13)

链接习语的整个想法是基于在每个链接的调用中访问相同的原始对象。这通常通过从每个修改方法将引用返回到原始对象来实现。这就是你的add应该被宣布的方式

    Counter &add() { // <- note the `&`
        ++count; return *this;
    }

这样,链接表达式中add的每个应用程序都将修改相同的原始对象。

在原始代码中,您从add返回原始对象的临时副本。因此,add的每个附加应用程序(在第一个之后)都可以在临时副本上运行,修改该副本并生成另一个临时副本。所有这些临时副本在完整表达结束时消失得无影无踪。出于这个原因,除了第一个调用之外,你永远不会看到任何add个调用的效果。