从非常量对象调用 const 函数

新手上路,请多包涵

我需要从非常量对象调用 const 函数。查看示例

struct IProcess {
   virtual bool doSomeWork() const = 0L;
};
class Foo : public IProcess {
  virtual bool doSomeWork() const {
    ...
  }
};

class Bar
{
public:
   const IProcess& getProcess() const {return ...;}
   IProcess& getProcess() {return ...;}

   void doOtherWork {
    getProcess().doSomeWork();
  }
};

打电话

getProcess().doSomeWork();

总是会导致调用

IProcess& getProcess()

有没有别的方法可以打电话

const IProcess& getProcess() const

从非常量成员函数?到目前为止我用过

const_cast<const Bar*>(this)->getProcess().doSomeWork();

这可以解决问题,但似乎过于复杂。


编辑:我应该提到代码正在被重构,最终只剩下一个函数。

 const IProcess& getProcess() const

但是,目前存在副作用,有时 const 调用可能会返回 IProcess 的不同实例。

请继续话题。

原文由 Chris 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 473
2 个回答

避免演员表:将其分配给 const Bar * 或其他任何东西并使用它来调用 getProcess()

这样做有一些迂腐的理由,但它也让你在不强制编译器做一些可能不安全的事情的情况下更清楚你在做什么。当然,您可能永远不会遇到这些情况,但您不妨编写一些在这种情况下不使用强制转换的东西。

原文由 MSN 发布,翻译遵循 CC BY-SA 3.0 许可协议

const_cast 是为了 抛弃 constness!

您正在从非常量转换为安全的 const,因此请使用 static_cast

    static_cast<const Bar*>(this)->getProcess().doSomeWork();

我的意思是从技术上讲,您可以使用 const_cast 进行常量化,但这不是对运算符的务实使用。新风格演员表(相对于旧的 c 风格演员表)的目的是传达演员表的意图。 const_cast 是一种代码味道,至少应该审查它的使用情况。 static_cast 另一方面是安全的。但这是 C++ 风格的问题。

或者您可以创建一个新的(私有)const 方法,并从 doOtherWork 调用它:

   void doSomeWorkOnProcess() const { getProcess().doSomeWork(); }

使用 const 临时也是一种选择(由“MSN”回答):

    const Bar* _this = this;
   _this->getProcess().doSomeWork();

原文由 mfazekas 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题