我的代码如下,我在numberCollisions + = collisionNum时遇到错误; 错误状态'numberCollisions'无法修改,因为它是通过const对象使用的。这个错误刚刚弹出,因为它是一个const函数吗?谢谢你的帮助。
int HashTable_qp::findPos( const string & x ) const
{
/* 1*/ int collisionNum = 0;
/* 2*/ int currentPos = myhash( x, array.size( ) );
/* 3*/ while( array[ currentPos ].info != EMPTY &&
array[ currentPos ].element != x )
{
/* 4*/ currentPos += 2 * ++collisionNum - 1; // Compute ith probe
/* 5*/ if( currentPos >= array.size( ) )
/* 6*/ currentPos -= array.size( );
}
numberCollisions += collisionNum;
/* 7*/ return currentPos;
}
答案 0 :(得分:6)
是 - 对于这样的情况,您修改的内部簿记号不会影响对象的逻辑状态,您可能需要考虑使用mutable
限定符来定义变量:
class HashTable_op {
mutable int numberCollisions;
};
答案 1 :(得分:4)
是的,正是因为这个原因。常量方法意味着您不会更改实例,但是您会这样做,因为您的findPos
应该更改实例。所以只需删除const
然后继续。
答案 2 :(得分:1)
是的,这就是错误的原因。要在这种情况下使编译器闭嘴,您可以标记成员mutable
。但是,我不确定你在这里做了什么,如果让编译器关闭将是正确的响应。
使用mutable
的的经典示例场景将执行昂贵但不变异的操作(因此相应的函数为const
),但想要缓存结果,如果再次立即调用该函数,则不必再次执行此操作。您需要某处存储结果,但函数为const
;因此,mutable
来救援。