Как вызвать функцию 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.