2012-05-12 16 views
8

में स्थानीय चरणीय दायरे के लिए सर्वोत्तम अभ्यास मेरे पास एक कार्यशील C++ कॉलबैक फ़ंक्शन है, जो उपयोगकर्ता के माउस डाउन 'ईवेंट द्वारा ट्रिगर किया गया है। (आईडीई वीएस -2010 है।)सी ++ कॉलबैक

प्रत्येक कॉल के साथ, मैं कॉलबैक के दायरे में स्थानीय एक साधारण गणना चर विकसित करना चाहता हूं। सीधे शब्दों में कहें, ऐसा करने के लिए 'सर्वोत्तम प्रथाओं' तरीका क्या है?

किसी भी राय या निर्देश के लिए अग्रिम धन्यवाद।

+2

यदि आप केवल यह कॉलबैक फ़ंक्शन में चाहते हैं, तो एक स्थिर चर वह है जो आप चाहते हैं। – Geoffroy

+0

आप एक स्थैतिक चर का उपयोग कर सकते हैं, लेकिन सामान्य – maress

उत्तर

13

अपने कॉलबैक फ़ंक्शन को एक मजेदार के साथ बदलें - वे राज्य को स्टोर कर सकते हैं। एक उदाहरण functor:

#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 functor अंदर के उपयोग - इस वजह से f functor की स्थानीय प्रतिलिपि (ध्यान दें पास-दर-मूल्य) है और आपको लगता है कि प्रति अपनी int साझा करना चाहते हैं उस मज़ेदार के साथ जिसके पास आपको पहुंच है। ध्यान दें कि f को मूल्य के आधार पर अपना तर्क लेना है, क्योंकि आप सभी कॉलबेल का समर्थन करना चाहते हैं, न केवल मज़ेदार।

+0

में इसके उपयोग के बारे में बहुत सावधानी बरतें उदाहरण में एक साझा सूचक का उपयोग करके आपको कम से कम वोट देना चाहिए? एक साधारण int सदस्य चर पर्याप्त – maress

+2

@maress से अधिक होगा: पहले स्पष्टीकरण पढ़ें और फिर निर्णय लें। –

+1

इसके अलावा, कॉलबैक प्राप्तकर्ता एक ऑब्जेक्ट हो सकता है जिसमें कॉपी सेमेन्टिक्स की आवश्यकता होती है (उदाहरण के लिए एक मानक लाइब्रेरी कंटेनर में सभी कॉलबैक स्टोर करता है) – juanchopanza

संबंधित मुद्दे