【发布时间】:2012-08-05 23:50:41
【问题描述】:
考虑在某个库中(我们无权更改),我们有一个 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 的计数器,重置计数。这会让来电者有些悲伤。 (想象一下更有害的事情发生了,你就会明白我要去哪里了。)
我需要能够碰撞c(因此,我需要它是可变的),但我希望breakTheHellOutOfCounter() 由于试图替换 c 而惨遭失败。有没有办法我可以改变一些事情(Counter 类除外)来实现这一点?
(我知道在最低级别,这几乎是不可能强制执行的。我想要的是一种让意外难以做到的方法。)
【问题讨论】:
-
要解决这个问题:将
Counter更改为不包含operator=不是一种选择? -
只有几点。
count成员不可变本身并没有错;如果合适的话,你可以让它成为你使用它的任何其他类的mutable成员。没有客户端代码会写入c = Counter()并意外重置计数器;有问题的场景真的是它嵌入的对象的意外成员复制吗?如果是这样,您可能会使容器类不可复制...(最佳语法因 C++03/C++11 不同而异,但很容易在 Google 上搜索到)。 -
@delnan:不是这样。我的意思是,对于我创建的类型,它是一种选择,但如果我无法使用别人的东西,我需要知道如何将潜在的损害降到最低。 :)
标签: c++ pass-by-reference