Ответ 1
вы должны изменить свою программу, чтобы правильно использовать /declare const...
одной альтернативой является использование const_cast.
У меня есть функция устаревания, которая выглядит так:
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(), которая не является константой? Или у кого-нибудь есть идеи о том, как реализовать newCall()
внутри Random()
, не делая половину моей программы const.
Спасибо
-josh
вы должны изменить свою программу, чтобы правильно использовать /declare 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 не изменит "this".
Без использования const cast вы можете попробовать создать новый экземпляр класса в методе Random()
?
Квалификатор const
утверждает, что экземпляр this
этого класса не будет изменен после операции, что автоматическое определение компилятора.
const_cast
можно использовать, но его зло
если это действительно генератор случайных чисел, тогда код генерации числа/состояние может быть помещен в локальный статический генератор класса. таким образом, ваш объект не мутируется, и метод может оставаться const.