强制外部函数为const

时间:2012-05-31 10:28:11

标签: c++ const mutable const-correctness const-cast

这是我的问题。我使用声明为const的成员函数创建了一个类,该函数使用了我无法修改的外部函数(在其他人的代码中声明)并且未声明为const。更确切地说是

其他人的代码

class B {
public:
    void foo();
};

我的代码

class A : public B {
public:
    void bar() const {
        this->foo();
    }
};

我知道对于会员数据,我们可以使用mutableconst_cast强制使用const正确性。我怎么能foo这样我的编译器就知道我想使用它就好像它是const一样,即使它没有在别人的代码中声明它?

4 个答案:

答案 0 :(得分:6)

  1. 不要这样做。

  2. 不要这样做:

  3. 示例:

    class A : public B { 
    public: 
        void bar() const { 
            const_cast<B*>(static_cast<const B*>(this))->foo();
        } 
    }; 
    

    编辑:有效的用例是:

    1. 功能B::foo() 不会修改状态,而可能已声明为const ,但是......
    2. 撰写B::foo()的人忘了宣布它为const,而且......
    3. 你不能改变它,因为它会破坏你无法控制的东西。
    4. 理论上说这不可能发生,但在实践中它有时会发生。

      正如其他答案者正确说过的那样,更好的答案是修复B::foo(),或者提供一个替代函数来执行相同的事情 声明为const。

答案 1 :(得分:3)

让你的函数非常量。这是正确的方法。

这表明您将修改您的州。

答案 2 :(得分:1)

使B::foo() const,或使A::bar()非const。两个中的一个。

答案 3 :(得分:0)

您可以按如下方式声明bar():

void bar() const {
    B *that = (B *) this;
    that->foo();
}

不确定任何意外的副作用。