如何在const函数中调用非const函数(C++)

Gra*_*min 20 c++ const function const-correctness const-cast

我有一个看起来像这样的遗留函数:

int Random() const
{
  return var_ ? 4 : 0;
}
Run Code Online (Sandbox Code Playgroud)

我需要在遗留代码中调用一个函数,以便它现在看起来像这样:

int Random() const
{
  return var_ ? newCall(4) : 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是我收到了这个错误:

In member function 'virtual int Random() const':
class.cc:145: error: passing 'const int' as 'this' argument of 'int newCall(int)' discards qualifiers
Run Code Online (Sandbox Code Playgroud)

现在我知道为了解决这个错误我可以使我newCall()的const函数.但后来我有几个newCall()函数调用,所以现在我必须使所有这些函数调用const.等等,直到最后我觉得我的程序的一半将是const.

我的问题:有没有办法在Random()中调用一个不是const的函数?或者有没有任何想法如何实现newCall()内部Random()而不使我的程序const的一半.

谢谢

-josh

jus*_*tin 19

应该改变你的程序正确使用/声明const ...

一种替代方法是使用const_cast.

  • 错误地使用const_cast(这将会发生什么)会导致完全的灾难. (5认同)
  • 感谢您的建议,我最终将newCall()和newCall()下面的函数更改为const,因为我不想错误地使用const. (3认同)
  • +1:如果可以,将所有相关函数设为`const`. (2认同)
  • @Grammin,欢迎你.正确地宣布它有很多好处.最重要的(imo)是它在维护和可读性方面节省了大量时间.编译器可能会在程序更改时快速检测到不正确的使用情况.一个副作用是c ++开始编写如此多的consts,你认为如果const在某些情况下是默认值,并且使用关键字来指定变异,那将会很好:) (2认同)

Naw*_*waz 17

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

但这不是一个好主意.如果可能的话,避免!

  • 就像你说的,如果你确实需要使用 `const_cast` 来完成这个任务,请尝试重构你的设计。 (2认同)

Eri*_*rik 5

const_cast<MyClass *>(this)->newCall(4)
Run Code Online (Sandbox Code Playgroud)

仅当您确定 newCall 不会修改“this”时才执行此操作。