C++ 如何修改/更新常量引用传递的对象的内部状态

C++ 如何修改/更新常量引用传递的对象的内部状态,c++,vector,pass-by-const-reference,C++,Vector,Pass By Const Reference,通过常量引用传递对象意味着我们不能修改它的任何成员。但是假设对象包含一个向量成员。假设还需要一个vector::iterator成员,并且每次读取后必须更新该成员以指向向量中的下一个元素,我们如何编写const方法来读取vector成员的内容 这是可能的,还是在这种情况下有其他方法?也就是说,不要修改passed by const引用对象的内容,但该对象应该能够更新其内部状态(即,要读取的向量中的下一个元素)。听起来像是在寻找关键字mutable。可变成员变量可在constmember方法中修改

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


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

听起来像是在寻找关键字
mutable
。可变成员变量可在
const
member方法中修改。你可以读到它。例如:

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_++;
    }
};
A类
{
标准::向量v;
可变std::vector::常量迭代器当前值;
公众:
int get()常量//注意常量
{
断言(!v_.empty());
如果(current_==v_u.end())current_==v_u.begin();
返回*当前值++;
}
};
注意,您仍然需要
const\u迭代器
,因为向量本身是const,因此
v\uu。begin()
不提供普通迭代器。您可以通过将向量本身标记为
可变
,然后使用
迭代器来解决此问题


以下是完整的。

如果您有一个成员希望在
const
方法中修改-声明它们
mutable

不要这样做:如果您想要像first()、next()、last()这样的语义来迭代容器,请创建一个代理:

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

您可以使用
vector::const_迭代器
来迭代向量吗?我正在尝试修改迭代器,它是const引用传递的对象的成员(即,我无法修改它)。正如其他人所指出的,将成员声明为可变似乎是答案。如果要修改它,为什么要将其作为
const&
传递?我实际上想读取它,但我不知道如何将迭代器保留为passed by const引用对象的成员,并在每次读取后递增它。还有其他方法吗?应该是最新的,对吗?是的,这听起来像是我在寻找的解决方案。但是,当我试图在const方法中的向量开头(it_=v_v.begin())设置迭代器时,我得到了一个“错误:与‘operator=’不匹配”。@Mihai更新了我的答案。回答了这个问题,但我的hack-o-meter正在抖动。“不能向上投票,因为它回避了可能的真正问题。”约翰迪林说。对于OP,我认为首先了解
mutable
的存在是很重要的,但很难判断这对他的情况是否是一个好的解决方案。问题描述本身对我来说有点奇怪,在现实生活中,我会首先对导致这个问题的设计提出质疑:)好吧,让被传递的const引用对象成为对象的一个成员,它被传递到一个更好的解决方案?我试图让我的代码尽可能模块化。如果它是野兽,那么我接受惩罚:)不赞成使用可变字符吗?