2

これが私の問題です。const変更できない(他の誰かのコードで宣言されている)外部関数を使用し、宣言されていないとして宣言されたメンバー関数を使用してクラスを作成しましたconst。より正確に

他の誰かのコード

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

私のコード

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

mutableメンバーデータの場合、またはを使用してconst-correctnessを強制できることを知っていconst_castます。foo他の誰かのコードで宣言されていなくても、コンパイラがconstであるかのように使用したいことをコンパイラが理解できるように、どうすれば「ハッキング」できますか?

4

4 に答える 4

6
  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()するか、同じことを行う代替関数を提供することです。

于 2012-05-31T10:37:10.740 に答える
3

関数を非定数にするだけです。それが正しい方法です。

これにより、状態を変更することが明確になります。

于 2012-05-31T10:29:52.953 に答える
1

B::foo()constを作成するか、non A::bar()-constを作成します。2つのうちの1つ。

于 2012-05-31T10:33:01.870 に答える
0

次のように bar() を宣言できます。

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

意図しない副作用についてはわかりません。

于 2012-05-31T10:38:10.103 に答える