Как вызвать неконстантную функцию внутри функции const (C++)



У меня есть унаследованная функция, которая выглядит следующим образом:

int Random() const
{
  return var_ ? 4 : 0;
}

И мне нужно вызвать функцию в этом устаревшем коде, чтобы она теперь выглядела так:

int Random() const
{
  return var_ ? newCall(4) : 0;
}

Проблема в том, что я получаю эту ошибку:

In member function 'virtual int Random() const':
class.cc:145: error: passing 'const int' as 'this' argument of 'int newCall(int)' discards qualifiers

Теперь я знаю, что для исправления этой ошибки я могу сделать мою newCall() функцию const. Но тогда у меня есть несколько вызовов funciton в newCall(), которые я должен сделать, так что теперь мне придется сделать все эти вызовы функций const. И так далее, и так далее, пока в конце концов я не почувствую ... как будто половина моей программы будет const.

Мой вопрос: есть ли способ вызвать функцию внутри Random (), которая не является const? Или у кого-нибудь есть идеи о том, как реализовать newCall() в Random(), не делая половину моей программы const.

Спасибо

- Джош

151   7  

7 ответов:

Вы должны изменить вашу программу, чтобы правильно использовать/объявить const...

Один из вариантов-использовать const_cast.

int Random() const
{
  return var_ ? const_cast<ClassType*>(this)->newCall(4) : 0;
}

, но это не очень хорошая идея. Избегайте, если это возможно!

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

const_cast<MyClass *>(this)->newCall(4)

Делайте это только в том случае, если вы уверены, что newCall не изменит "это".

Не используя приведения const, не могли бы вы попробовать создать новый экземпляр класса в методе Random()?

Квалификатор const утверждает, что экземпляр this класса останется неизменным после операции, что компилятор не может автоматически вывести.

const_cast может быть использован, но его зло

Если это действительно генератор случайных чисел, то код/состояние генерации чисел, вероятно, может быть помещен в локальный статический генератор класса. таким образом, ваш объект не мутирует, и метод может оставаться неизменным.

    Ничего не найдено.

Добавить ответ:
Отменить.