изменение приватного int в проблеме с константной функцией - PullRequest
1 голос
/ 06 декабря 2011

Мой код указан ниже, и у меня возникла ошибка с numberCollisions + = collisionNum; Состояния ошибки, 'numberCollisions' не могут быть изменены, потому что он используется через объект 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;
}

Ответы [ 3 ]

6 голосов
/ 06 декабря 2011

Да - для чего-то подобного, когда вы изменяете внутренний бухгалтерский номер, который не влияет на логическое состояние объекта, вы можете рассмотреть возможность определения переменной с помощью квалификатора mutable:

class HashTable_op { 
    mutable int numberCollisions;

};
4 голосов
/ 06 декабря 2011

Да, именно по этой причине. Постоянный метод подразумевает, что вы не будете изменять экземпляр, но вы это делаете, поскольку ваш findPos - это , который должен изменить экземпляр. Так что просто удалите const и продолжайте.

1 голос
/ 06 декабря 2011

Да, это причина ошибки.Чтобы в этом случае компилятор отключился, вы можете пометить элемент mutable.Однако я не уверен, что именно вы здесь делаете, и если корректное завершение работы компилятора будет правильным ответом.

Классический пример сценария для с использованием mutable будет иметь местогде вы выполняете дорогостоящую, но не мутирующую операцию (поэтому соответствующая функция - const), но хотите кэшировать результаты, чтобы вам не пришлось делать это снова, если функция вызывается немедленно еще раз.Вам нужно где-то сохранить результат, но функция const;следовательно, mutable на помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...