2011-11-26 76 views
0

我有一個Button類。 當我點擊這個按鈕時,它被選中()方法被調用。從類方法回調(C++)

//Button.cpp 
void Button::selected(){ 
//Do Something 
} 

//Player.cpp 
void Player::Jump(){ 
//Jump! 
} 

我也有一個播放器類。 我想這樣做,當我點擊按鈕時,播放器方法的跳轉() 被調用。我想我可以將播放器類與按鈕連接起來。 但後來我意識到,按鈕類將有許多其他用途,而不是讓我的玩家跳躍 。 (即:菜單選擇器?使播放器移動?等)

所以我想包括某種回調,但我不太熟悉他們,我無法理解一些教程我已閱讀。

有人能告訴我如何使用selected()方法將任何函數/方法作爲參數並在方法體中執行它?

回答

1

在這裏你將一個函數作爲參數仿函數的方法:

template <typename functor_t> 
void Button::selected(functor_t func){ 
    // ... 
    func(); 
    // ... 
} 

這個參數可以是一個函數指針或函數對象:

struct functor { 
    void operator()() { 
    // stuff 
    } 
}; 

void function() { 
    // stuff 
} 

使用指針調用void method()成員:

struct foo { 
    void bar() { 
    std::cout << "hello"; 
    } 
}; 

template <typename class_t> 
void function(class_t& c, void (class_t::* mp)()) { 
    (c.*mp)(); 
} 

foo x; 
function(x, &foo::bar); 
+3

對於大多數情況,我們有'std :: function'和'std :: bind'。 –