Подтвердить что ты не робот

Как вызвать функцию non-const внутри функции const (С++)

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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