Как вызвать неконстантную функцию внутри функции 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.
Спасибо
- Джош
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может быть использован, но его зло
Если это действительно генератор случайных чисел, то код/состояние генерации чисел, вероятно, может быть помещен в локальный статический генератор класса. таким образом, ваш объект не мутирует, и метод может оставаться неизменным.
Comments