2012-05-12 17 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

関連する問題