2012-05-12 93 views
8

我有一個正在運行的C++回調函數,由用戶的「鼠標向下」事件觸發。 (IDE是VS2010。)C++回調中局部變量作用域的最佳實踐

每次調用時,我想增加一個簡單的計數變量,該變量對回調的作用域是本地的。簡而言之,做到這一點的「最佳實踐」方式是什麼?

在此先感謝您的任何意見或指示。

+2

如果你只想在回調函數中使用這個變量,那麼你需要一個靜態變量。 – Geoffroy

+0

你可以使用一個靜態變量,但要非常小心地使用它的一般情況 – maress

回答

13

用函子替換你的回調函數 - 它們可以存儲狀態。一個例子函子:

#include <iostream> 
#include <memory> 

class Functor 
{ 
private: 
    std::shared_ptr<int> m_count; 

public: 
    Functor() 
    : m_count(new int(0)) 
    {} 

    void operator()() 
    { 
     ++(*m_count); 
     // do other stuff... 
    } 

    int count() const 
    { 
     return *m_count; 
    } 
}; 

template <typename F> 
void f(F callback) 
{ 
    // do stuff 
    callback(); 
    // do other stuff 
} 

int main() 
{ 
    Functor callback; 
    f(callback); 
    f(callback); 
    std::cout << callback.count(); // prints 2 
    return 0; 
} 

注意使用shared_ptr仿函數裏面的 - 這是因爲f有仿函數的本地副本(注意通過噪聲值),並且希望該副本共享其int與你有權訪問的函數。還要注意f必須以價值爲參數,因爲你想支持所有的可調用函數,而不僅僅是函子。

+0

是應該投票你平凡使用示例中的共享指針嗎?一個簡單的int成員變量可能綽綽有餘 – maress

+2

@maress:先閱讀解釋然後再決定。 –

+1

此外,回調的接收者可能是一個需要複製語義的對象(例如,將所有回調存儲在標準庫容器中的東西) – juanchopanza