这是一个简单的计数器。正在调用方法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();
}
答案 0 :(得分:13)
链接习语的整个想法是基于在每个链接的调用中访问相同的,原始对象。这通常通过从每个修改方法将引用返回到原始对象来实现。这就是你的add
应该被宣布的方式
Counter &add() { // <- note the `&`
++count; return *this;
}
这样,链接表达式中add
的每个应用程序都将修改相同的,原始对象。
在原始代码中,您从add
返回原始对象的临时副本。因此,add
的每个附加应用程序(在第一个之后)都可以在临时副本上运行,修改该副本并生成另一个临时副本。所有这些临时副本在完整表达结束时消失得无影无踪。出于这个原因,除了第一个调用之外,你永远不会看到任何add
个调用的效果。