Как вызвать функцию non-const внутри функции 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. И так далее и так далее, пока в конце концов я чувствую, что половина моей программы будет константной.

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

спасибо

-Джош

7 ответов


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

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


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

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


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


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

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


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


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

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


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