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

时间:2011-02-15 19:27:50

标签: c++ function const const-correctness 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函数。但是后来我在newCall()中进行了几次funciton调用,所以现在我必须将所有这些函数调用为const。等等,直到最后我觉得我的程序的一半将是const。

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

由于

-josh

7 个答案:

答案 0 :(得分:18)

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

一种替代方法是使用const_cast。

答案 1 :(得分:14)

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

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

答案 2 :(得分:1)

这里有两种可能性。首先,newCall及其所有被调用者实际上是非修改函数。在这种情况下,您应该完全标记它们const。您和未来的代码维护者都会感谢您使代码更容易阅读(从个人经验来讲)。其次,newCall DOES实际上会改变对象的状态(可能通过它调用的函数之一)。在这种情况下,您需要中断API并使Random非const以正确地向调用者指示它修改了对象状态(如果修改仅影响物理常量而不是逻辑常量,则可以使用可变属性并传播{ {1}})。

答案 3 :(得分:0)

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

如果您确定newCall不会修改“this”,则只执行此操作。

答案 4 :(得分:0)

如果不使用const转换,您是否可以尝试在Random()方法中创建该类的新实例?

答案 5 :(得分:0)

const限定符断言该类的实例this在操作后将保持不变,这是编译器无法自动推断的。

const_cast可以使用,但它的邪恶

答案 6 :(得分:0)

如果它确实是一个随机数生成器,那么数字生成代码/状态可能会放在类本地静态生成器中。这样,您的对象不会发生变异,并且该方法可能保持不变。