5

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

#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();

}
4

1 回答 1

13

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

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

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

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

于 2012-08-17T19:05:44.597 回答