2008-09-16 6 views
8

क्या सी ++ में कस्टम इवेंट बनाना संभव है? उदाहरण के लिए, कहें कि मेरे पास वेरिएबल एक्स है, और वेरिएबल वाई। जब भी एक्स बदलता है, तो मैं एक फ़ंक्शन निष्पादित करना चाहता हूं जो वाई को 3x के बराबर सेट करता है। क्या इस तरह के एक ट्रिगर/घटना बनाने का कोई तरीका है? (ट्रिगर्स कुछ डेटाबेस में आम हैं)सी ++ में कस्टम घटनाएं?

उत्तर

0

जहां तक ​​मुझे पता है आप डिफ़ॉल्ट चर के साथ यह नहीं कर सकते, फिर भी अगर आप एक वर्ग है कि एक कॉलबैक फ़ंक्शन ले लिया लिखा हूँ तुम अन्य वर्गों को पंजीकरण कर सकता है कि वे किसी भी बदलाव के बारे में अधिसूचित होना चाहते हैं।

10

यह मूल रूप से पर्यवेक्षक पैटर्न का एक उदाहरण है (जैसा कि अन्य ने उल्लेख किया है और लिंक किया है)। हालांकि, आप इसे थोड़ा और वाक्य रचनात्मक रूप से पैलेट करने के लिए टेम्पलेट जादू का उपयोग कर सकते हैं। क्या विधि आप लिखने के लिए अपने पर्यवेक्षक कॉलबैक कार्यों यह आप पर निर्भर कर रहे हैं का उपयोग करें की तरह कुछ पर विचार करें ...

template <typename T> 
class Observable 
{ 
    T underlying; 

public: 
    Observable<T>& operator=(const T &rhs) { 
    underlying = rhs; 
    fireObservers(); 

    return *this; 
    } 
    operator T() { return underlying; } 

    void addObserver(ObsType obs) { ... } 
    void fireObservers() { /* Pass every event handler a const & to this instance /* } 
}; 

तो फिर तुम लिख सकते हैं ...

Observable<int> x; 
x.registerObserver(...); 

x = 5; 
int y = x; 

; मैं http://www.boost.org के फ़ंक्शन या कार्यात्मक मॉड्यूल का सुझाव देता हूं (आप साधारण फ़ैक्टर का भी उपयोग कर सकते हैं)। मैं आपको इस प्रकार के ऑपरेटर ओवरलोडिंग के बारे में सावधान रहने के लिए सावधानी बरतता हूं। हालांकि यह कुछ कोडिंग शैलियों को स्पष्ट कर सकता है, बेकार उपयोग

seemLikeAnIntToMe = 10;

बहुत महंगा ऑपरेशन, जो अच्छी तरह से विस्फोट हो सकता है, और आने वाले सालों के लिए डिबगिंग दुःस्वप्न का कारण बन सकता है।

+0

ग्रेट स्पष्टीकरण! मैंने पिछले परियोजनाओं में बढ़ावा दिया है और हमेशा परिणामों से खुश हूं। –

3

Boost signals एक अन्य सामान्यतः उपयोग की जाने वाली लाइब्रेरी है जिसे आप पर्यवेक्षक पैटर्न (उर्फ प्रकाशित-सदस्यता) करने के लिए आ सकते हैं। क्रेता यहां सावधान रहें, मैंने सुना है कि इसका प्रदर्शन भयानक है।