【问题标题】:modifying a private int in a const function issue在 const 函数问题中修改私有 int
【发布时间】:2011-12-06 00:55:38
【问题描述】:

我的代码在下面,我遇到了 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;
}

【问题讨论】:

  • ¤ 是的,您正在尝试修改对象的一部分,逻辑上是const。很可能这会告诉您更新numberCollisions 不是正确的做法。或者,如果正确,则删除const。在任何情况下,您都不应将其设为mutable,或拥有指向它的成员指针,或对编译器的const 检查进行任何此类规避,这类似于将核电站的警报喇叭静音。我之所以提到这一点,是因为您可能会得到一两个建议的答案。干杯&hth.,

标签: c++ arrays constants


【解决方案1】:

是的 - 对于这样的事情,您正在修改不影响对象逻辑状态的内部簿记编号,您可能需要考虑使用 mutable 限定符定义变量:

class HashTable_op { 
    mutable int numberCollisions;

};

【讨论】:

  • -1 表示对 mutable 的不良推荐。杰瑞 我真的没想到你会这样。这家伙对const 的基本知识感到困惑,而您正在推荐mutable,呃哦。
  • @AlfP.Steinbach:对不起 Alf,但你在这里完全错了。跟踪哈希表中遇到的冲突次数是一个完美示例,它不会修改表的逻辑状态,因此是 mutable 的完全合理用途。
  • 在插入操作中计算冲突是有意义的。那是非const,因此不需要mutable。在 const 代码中每次查找项目时添加冲突次数是没有意义的,因此在这种情况下也不需要 mutable。因此,声称这是使用mutable 的“完美示例”有点奇怪。根本不需要mutable
  • @AlfP.Steinbach :我同意 Jerry 的观点——跟踪碰撞次数不会影响对象的 observable 状态。这是关键的区别,并且 mutable 非常合适。
  • @ildjarn:你怎么能同意mutable 是一个根本不需要它的解决方案?这对技术人员来说是愚蠢的。这对我来说听起来纯粹是社交。
【解决方案2】:

是的,正是因为这个原因。常量方法意味着您不会更改实例,但您会这样做,因为您的 findPos is 应该更改实例。因此,只需删除 const 并继续前进。

【讨论】:

    【解决方案3】:

    是的,这就是错误的原因。要使编译器在这种情况下关闭,您可以标记成员mutable。但是,我不确定您到底在做什么,以及让编译器关闭是否是正确的响应。

    使用mutable 的经典示例场景for 是您执行昂贵但不变异的操作(因此相应的函数是const)但想要缓存结果以便如果再次立即调用该函数,则不必再次执行此操作。你需要在某个地方存储结果,但函数是const;因此,mutable 来救援。

    【讨论】:

    • -1 表示对mutable 的不良推荐。它不适合尚未了解/学习const 基础知识的人。从解释const 和不太先进/罕见的解决方案开始。
    • @AlfP.Steinbach:我恭敬地争辩说我肯定推荐mutablemutable 之后的第一句话明确表达了我对它是否正确的怀疑。
    • @Jon 我严重怀疑 Alf 基于他对 OP 准备消化给定答案的理解而投票否决答案的做法。 FWIW,+1 补偿。
    猜你喜欢
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2021-12-15
    相关资源
    最近更新 更多