2012-05-12 5 views
8

Bir 'fare aşağı' olayının tetiklediği, çalışan bir C++ geri çağırma işlevim var. (IDE, VS2010'dur.)Bir C++ geri çağrımında yerel değişken kapsamı için en iyi uygulama

Her aramada, geri arama kapsamına yerel olan basit bir sayı değişkeni artırmak istiyorum. Basitçe söylemek gerekirse, bunu yapmak için 'en iyi uygulamalar' yolu nedir?

Herhangi bir fikir veya direktif için şimdiden teşekkür ederiz.

+2

Bu değişkeni yalnızca geriçağırım işlevinde istiyorsanız, istediğiniz statik bir değişkendir. – Geoffroy

+0

bir statik değişken kullanabilir, ancak genel olarak kullanımı hakkında çok dikkatli olun – maress

cevap

13

Geri arama işlevinizi bir functor ile değiştirin - durumu kaydedebilir. Bir örnek funktoru:

#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; 
} 

Not funktor içinde shared_ptr kullanımı - f funktor yerel bir kopyasını (not pass-by-value) vardır ve bu kopya onun int paylaşmak istiyorum çünkü bu erişiminiz olan functor ile. Ayrıca, f'un argümanını değerlere göre alması gerektiğini unutmayın, çünkü yalnızca tüm hızlandırıcıları desteklemezsiniz.

+0

örnekte paylaşılan bir işaretçi kullanarak önemsiz bir şekilde oylama yapmalı mıdır? Basit bir int üye değişkeni, – maress

+2

@ maress'e yetecektir: Önce açıklamayı okuyun ve sonra karar verin. –

+1

ayrıca, geri bildirimin alıcısı, kopya semantiği gerektiren bir nesne olabilir (örneğin, standart kütüphane kapsayıcısında tüm geri aramaları saklayan bir şey) – juanchopanza

İlgili konular