【问题标题】:Force external function to be const强制外部函数为 const
【发布时间】:2012-05-31 10:28:10
【问题描述】:

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

别人的代码

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

我的代码

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

我知道对于成员数据,我们可以通过使用mutableconst_cast 来强制保持正确性。我怎样才能“破解”foo,以便我的编译器明白我想像使用它一样使用它,即使它没有在其他人的代码中声明?

【问题讨论】:

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


    【解决方案1】:
    1. 不要那样做。

    2. 不要这样:

    例子:

    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. 您无法更改它,因为它会破坏您无法控制的东西。

    理论上这不可能发生,但实际上有时会发生。

    正如其他回答者正确所说的那样,更好的答案是固定B::foo(),或者提供一个替代函数来做同样的事情声明为const。

    【讨论】:

    • 我知道编码不好。但是我必须使用其他人的代码并且我无法更改我的源代码(声明了B 的文件)。在我的真实代码中,A 继承自另一个类 C,这与 B 无关,所以这种转换是不可能的,尽管它应该在我原始帖子中的简化代码中工作。不过感谢您的提示。
    • 我完全符合您的有效用例。我将尝试修复B,尽管这可能是不可能的,否则我将更改我的所有设计并且不使用 const 正确性。感谢您的详细帖子。
    【解决方案2】:

    只要让你的函数非常量。这才是正确的做法。

    这表明您将修改您的状态。

    【讨论】:

    • 我的操作中的代码是我真实代码的简化版本。出于多种原因,我需要将 bar 声明为 const。我应该在我的作品中这么说。
    • 你所有的理由都是无效的。如果不是const,请不要使用const。也许你应该忽略你的设计。
    • 它是constbar 也不会更改对象,但没有这样声明,我无法修改 B 类,因为它是在其他人的代码中声明的。我只是想知道我是否可以通过使用黑客来简单地克服这个问题。如果不是,那么我确实应该改变我的设计。
    【解决方案3】:

    要么将B::foo() 设为常量,要么将A::bar() 设为非常量。两者之一。

    【讨论】:

      【解决方案4】:

      你可以声明 bar() 如下:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-13
        • 1970-01-01
        相关资源
        最近更新 更多