2009-03-11 15 views
3

は、私がどのように達成し、したいものの一例である:定数オブジェクトへのポインタを使用してメンバ関数ポインタを呼び出すにはどうすればよいですか?ここ

class MyClass 
{ 
    public: 
     void Dummy() const{} 

}; 
typedef void (MyClass::*MemFunc)(); 

void (const MyClass * instance) 
{ 
    MemFunc func=&MyClass::Dummy; 
    // (instance->*func)(); //gives an error 
     (const_cast<MyClass *>instance->*func)(); // works 
} 

はなぜコンパイラ(gccの3 & 4)は、インスタンスが非constであることを主張していますか?そのconst_castは問題を引き起こすでしょうか?

FYI:instance`は必ずしもconstではありませんが、私はちょうど被呼び出し者にそれを混乱させたくありません。

ここで何が起こっているか

答えて

7

エラーは前の行にあります。 typedefを

に変更する
typedef void (MyClass::*MemFunc)() const; 

constメンバー関数型へのポインタにするには。

このコードを検討する際に違いがより明確であるかもしれないし、それがどのように働くか:

typedef void FunctionType() const; 
typedef FunctionType MyClass::*MemFunc; 

特にメンバー関数ポインタは、実際には一般的にはメンバーポインタだけの特別なケースです。 constメンバ関数の場合、メンバ関数の関数型は非constメンバ関数の関数型とは異なります。そのため、タイプが一致しなければなりません。

0

のtypedefボイド(MyClassの:: * MemFunc)();ここで

あなたはそのオブジェクトを変更する可能性がある関数へのポインタを定義しています。

MemFunc FUNC = &のMyClass ::ダミー。ここで

あなたはは、そのようなポインタへのオブジェクト変更だないだろう機能を割り当てています。 が変更されていないため、のサブセットはであるため、これは合法です。が変更される可能性があります。

(インスタンス - > * func)();ここで

あなたは変更することができないオブジェクトを使用して、そのオブジェクトを変更する場合があります関数を呼び出すしようとしています。

MemFuncの定義を変更する必要があります

関連する問題