如何修改/更新const引用传递的对象的内部状态

时间:2013-10-17 16:27:58

标签: c++ vector pass-by-const-reference

通过const引用传递对象意味着我们无法修改它的任何成员。但是假设该对象包含vector<string>成员。我们如何编写const方法来读取vector<string>成员的内容,假设还需要vector<string>::iterator成员,并且必须在每次读取后更新以指向向量中的下一个元素?

这可能,或者在这种情况下还有其他方法吗?也就是说,不要修改const引用对象传递的内容,但是对象应该能够更新它的内部状态(即要读取的向量中的下一个元素)。

3 个答案:

答案 0 :(得分:2)

听起来您正在寻找关键字mutable。可变成员变量可在const成员方法中修改。你可以阅读它here。一个例子:

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

这是一个完整的live example

答案 1 :(得分:1)

如果您希望通过const方法修改成员,请将其声明为mutable

答案 2 :(得分:0)

不要这样做:如果你想拥有像first(),next(),last()这样的语义来迭代容器,那就创建一个代理:

Proxy iteration() const { return Proxy(*this); }