有没有办法编写对对象的只写引用?例如,假设有一个互斥类:
template <class T> class mutex {
protected:
T _data;
public:
mutex();
void lock(); //locks the mutex
void unlock(); //unlocks the mutex
T& data(); //returns a reference to the data, or throws an exception if lock is unowned
};
有没有办法保证一个人不能这样做:
mutex<type> foo;
type& ref;
foo.lock();
foo.data().do_stuff();
ref = foo.data();
foo.unlock();
//I have a unguarded reference to foo now
另一方面,这是否值得?我知道有些人认为程序员不会故意破坏系统,但是,为什么我们首先要有私有变量,嗯?只是说它是“未定义的行为”会很好,但这似乎有点太不安全了。
编辑:好的,我理解 setter 例程的想法,但这将如何实现?
mutex<vector<int> > foo;
foo.lock();
for (int i=0; i < 10; i++) {
foo.data().push_back(i);
}
foo.unlock(); 使用 set 例程将需要每次写入的副本:
mutex<vector<int> > foo;
foo.lock();
for (int i=0; i < 10; i++) {
vector<int> copy = foo.read();
copy.push_back(i);
foo.write(copy);
}
尽管您可以在这种特定情况下进行微不足道的优化,例如,如果几个不同的线程都在推动元素,甚至可能擦除一些元素,这可能会变成相当多的内存复制(即每个关键部分一个)。