2011-01-12 5 views
2
// Penguin.h 
#include <map> 
#include <iostream> 

class Penguin 
{ 
    typedef void (Penguin::*PenguinMet)(); 
    std::map<int, PenguinMet> Methods; 

    void Move(); 
    int p; 

public: 
    Penguin(); 
    void Walk();  
}; 

Penguin::Penguin() 
{ 
    p = 0; 
    Methods[0] = &Penguin::Move; 
}  

void Penguin::Move() 
{ 
    std::cout << p << std::endl; 
} 

void Penguin::Walk() 
{ 
    this->*Methods[p]; 
    *this.*Methods[p]; 
} 

別の方法

// Main.cpp 
#include "Penguin.h" 

int main() 
{ 
    Penguin Tux; 
    Tux.Walk(); 
    return 0; 
} 

このメイン()

からマップ上のメソッドを呼び出すしかし、私はそれを実行したときに Pが印刷されることはありません。

私は間違っていますか?あなたが実際に関数を呼び出していない

おかげ

答えて

4

は、あなただけの効果がありませんボイド表現、などのメンバ関数ポインタの値を見ています。あなたが実際にメソッドを呼び出すと(この場合はゼロ、引数、)適切な引数に渡してい

void Penguin::Walk() 
{ 
    (this->*Methods[p])(); 
    (*this.*Methods[p])(); 
} 

その方法:これにPenguin::Walkを変更します。関数呼び出しは->*.*演算子よりも優先順位が高いため、余分な括弧が必要であることに注意してください。

+0

ありがとう、ところで(* this。* Methods [p])();動作しません、私はアクセス違反エラーが発生します。何ができるか知っていますか? – kevinz

+0

@levin: '(* this。* methods [p])()'は '(this - > * Methods [p])()'と意味的に同じです。それがsegfaultする唯一の理由は、 'p'がマップ内にまだ存在しない場合です。したがって、' operator 'はデフォルト値のNULLを挿入して、逆参照します。しかし、その場合、両方のメソッド呼び出しが重複します。 –

0

これは決して関数を呼び出さないためです。

void Penguin::Walk() 
{ 
    this->*Methods[p]; 
    *this.*Methods[p]; 
} 

この機能は何もしません。

void Penguin::Walk() 
{ 
    (this->*Methods[p])(); 
    (*this.*Methods[p])(); 
} 

この関数は、物事を2回呼び出します。

関連する問題