通过 const 引用传递对象意味着我们不能修改它的任何成员。但是假设对象包含一个vector<string>
成员。vector<string>
假设vector<string>::iterator
还需要一个成员并且必须在每次读取后更新以指向向量中的下一个元素,我们如何编写 const 方法来读取成员的内容?
这是可能的,还是在这种情况下有另一种方法?也就是说,不要修改通过 const 引用对象传递的内容,但对象应该能够更新它的内部状态(即要读取的向量中的下一个元素)。
通过 const 引用传递对象意味着我们不能修改它的任何成员。但是假设对象包含一个vector<string>
成员。vector<string>
假设vector<string>::iterator
还需要一个成员并且必须在每次读取后更新以指向向量中的下一个元素,我们如何编写 const 方法来读取成员的内容?
这是可能的,还是在这种情况下有另一种方法?也就是说,不要修改通过 const 引用对象传递的内容,但对象应该能够更新它的内部状态(即要读取的向量中的下一个元素)。
听起来您正在寻找关键字mutable
。可变成员变量在const
成员方法中是可修改的。你可以在这里阅读。一个例子:
class A
{
std::vector< int > v_;
mutable std::vector< int >::const_iterator current_;
public:
int get() const // note the const
{
assert( !v_.empty() );
if( current_ == v_.end() ) current_ = v_.begin();
return *current_++;
}
};
请注意,您仍然需要const_iterator
,因为向量本身是 const ,因此v_.begin()
不会给您一个普通的迭代器。您可以通过将矢量本身也标记为 来解决此问题mutable
,然后您可以使用iterator
.
这是一个完整的现场示例。
如果您有一个希望在const
方法处修改的成员 - 声明它们mutable
。
不要这样做:如果您想使用 first()、next()、last() 等语义来迭代容器,请创建一个代理:
Proxy iteration() const { return Proxy(*this); }