0

我正在使用具有 A* 寻路算法的库 (libtcod)。我的类继承了回调基类,我实现了所需的回调函数。这是我的通用示例:

class MyClass : public ITCODPathCallback
{
...
public: // The callback function
   float getWalkCost(int xFrom, int yFrom, int xTo, int yTo, void *userData ) const 
   {
      return this->doSomeMath();
   };
   float doSomeMath() { // non-const stuff }
};

我发现了许多使用 const_cast 和 static_cast 的示例,但它们似乎是另一种方式,使非 const 函数能够返回 const 函数结果。在这个例子中我该怎么做?

getWalkCost() 由我的库定义,我无法更改,但我希望能够在其中做非常量的事情。

4

2 回答 2

6

最好的解决方案取决于你为什么要做非常量的东西。例如,如果您有一个结果缓存想要用来提高性能,那么您可以使缓存可变,因为这样可以保留逻辑常量:

class MyClass : public ITCODPathCallback
{
...
public: // The callback function
   float getWalkCost(int xFrom, int yFrom, int xTo, int yTo, void *userData ) const 
   {
      return this->doSomeMath();
   };
   float doSomeMath() const { // ok to modify cache here }
   mutable std::map<int,int> cache;
};

或者,也许您想记录一些关于调用 getWalkCost 的次数以及最大 x 值是多少的统计信息,然后传递对统计信息的引用可能是最好的:

class MyClass : public ITCODPathCallback
{
...
public: 
   struct WalkStatistics {
     int number_of_calls;
     int max_x_value;

     WalkStatistics() : number_of_calls(0), max_x_value(0) { }
   };

   MyClass(WalkStatistics &walk_statistics)
     : walk_statistics(walk_statistics)
   {
   }

   // The callback function
   float getWalkCost(int xFrom, int yFrom, int xTo, int yTo, void *userData ) const 
   {
      return this->doSomeMath();
   };
   float doSomeMath() const { // ok to modify walk_statistics members here }
   WalkStatistics &walk_statistics;
};
于 2013-04-22T13:56:27.347 回答
1

你可以这样破解它:

  return const_cast<MyClass*>(this)->doSomeMath();

当然这不会被大多数人认为是好的设计,但是,嘿。如果您愿意,您可以改为将 doSomeMath() 设为 const,并将它修改的数据成员标记为mutable.

于 2013-04-22T13:54:13.033 回答