考虑在某个库中(我们无权更改),我们有一个 Counter 类:
class Counter {
int count;
public:
Counter() : count(0) { }
void bump() { ++count; }
int getCount() const { return count; }
};
就其本质而言,它是可变的。如果它是 const,那它就毫无价值了。
在我们的代码中,我们“使用”了那个计数器。很糟糕。
#include <string>
#include <iostream>
#include <Counter.hpp>
using std::cout;
using std::endl;
void breakTheHellOutOfCounter(Counter &c) {
// This is OK
c.bump();
// Oh noes!
c = Counter();
}
int main() {
Counter c;
c.bump(); c.bump(); c.bump();
std::cout << "Count was " << c.getCount() << std::endl;
breakTheHellOutOfCounter(c);
std::cout << "Count is now " << c.getCount() << std::endl;
}
请注意,用闪亮的新计数器breakTheHellOutOfCounter
覆盖main
's 计数器,重置计数。这会让来电者有些悲伤。(想象一些更有害的事情发生,你会看到我要去哪里。)
我需要能够碰撞c
(因此,我需要它是可变的),但breakTheHellOutOfCounter()
由于试图替换 c
. 有没有办法我可以改变事情(除了Counter
班级)来实现这一点?
(我知道在最低级别,这几乎是不可能执行的。我想要的是一种让意外难以做到的方法。)