2010-11-22 16 views
0

私はもう一度レンガを打ってきました。もう一度何か私はそれが間違っている理由を見ていないし、それを動作させる方法がわからない:文は完全に無視されます(コンパイラによって省略されたかのように)

私はクラス Humanのインスタンスを持っています。クラス Humanは、 Objectから派生しています。 Objectクラスには、 "PerformStep"と呼ばれる奥行き関数があります。 Humanクラスはこの関数をオーバーロードします。 Humanクラスも "WalkAction"という機能を持っています。これで、PerformStep - Byメンバー関数ポインタの間にこの "walkaction"を呼びたいと思います。
私はポインタでこれを行うのが好きです:
人は愚かです。彼らはを知っています。はどのように歩くのですか?だから、神のインスタンスはステップ中に尋ねられるでしょう: "私は今何をすればよいのですか" - そして、その神のインスタンスは、正しいメンバ関数へのポインタを返します。

virtual void PerformStep() 
{ 
    postion.x += 0; //redundant line to check for the debugger 
    CALL_MEMBER_FN(*this,&Human::WalkAction); 
    Object::PerformStep(); 
} 

人間:: WalkAction:

void WalkAction(){ 
    position.x += 1; 
} 

CALL_MEMBER_FN(マクロ):
CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember))

問題は、私はデバッグモードでプログラムを実行すると、それは完全にが無視ということです関数ポインタを使用します。 - ステートメントごとにステートメントを実行すると、行をジャンプします。ウォークアクションにブレークポイントを置くと、ブレークポイントに到達しません。特定の行にブレークポイントを置くと、ブレークポイントは次のライン。

ここに何が起こっているのですか?

+2

マクロは、コードを読みにくくするだけです。 C++のFAQはこの点で間違っています。適切な構文を学ぶことは自明であり、すでに理解している構文を混同することはありません。 – GManNickG

答えて

6

このコンテキストでは、マクロは何も実行せず、関数へのポインタにのみ展開されます。関数を実際に呼び出すには、余分な括弧が必要です。

myObj->myfunc; // does nothing 
myObj->myFunc(); // calls the function 

私は、コンパイラがこれを最適化すると期待しているため、実行するコードやブレークするコードはありません。対応するアセンブラと交互に出力ソース・コードへのコンパイラのオプションを使用して最初の場所(推奨)

  • でマクロを使用していない

    • :あなたは、によって明確にこれを見ることができました。
  • +0

    マクロはC++のFAQによって支持されているようです:http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.6。 –

    +0

    これは私が意味するものではありません..私はexplicitelly関数を呼び出すしたくない:私は関数ポインタでそれを呼び出す.. – paul23

    +0

    ちょうど "for_each"コマンドのように、かっこの関数ポインタを提供しません! – paul23

    関連する問題