5

में अधिसूचना केंद्र आईओएस और मैक उद्देश्य सी ढांचे के साथ कुछ समय के लिए प्रोग्रामिंग के बाद, मुझे NSNotificationCenter और NSNotification कक्षाओं द्वारा लागू सामान्य अधिसूचना पैटर्न से प्यार आया है। सी ++ पर वापस आ रहा है, जो कि ज्यादातर चीजों के लिए मेरी पसंद की भाषा रही है, मैं खुद को इस पैटर्न को दोहराने की कोशिश कर रहा हूं और मानता हूं कि वहां वास्तव में पहले से ही समान सी ++ कक्षाओं का सामान्य कार्यान्वयन होना चाहिए जो इसके लिए समर्थन प्रदान करता है।सी ++

ऐसा लगता है कि बाद में अधिक गतिशील प्रकृति की वजह से यह उद्देश्य उद्देश्य सी से सी ++ में कार्यान्वित करना मुश्किल है, लेकिन यह असंभव से बहुत दूर लगता है। मैंने बूस्ट लाइब्रेरीज़ को देखा है क्योंकि वे आम तौर पर भयानक हैं और मेरी किस्मत नहीं ढूंढने में दुखी था। हालांकि बूस्ट :: बाइंड, बूस्ट :: लैम्डा, बूस्ट :: फ़ंक्शन लगता है जैसे वे अधिकतर काम करते हैं। क्या मुझे कुछ स्पष्ट याद आया है? क्या वहां कुछ भी पहले से मौजूद है जो मुझे आसानी से NSNotification/NSNotificationCenter व्यवहार को दोहराने की अनुमति देगा?

+0

क्या आपने Boost.signals को आजमाया है? – anno

+0

मुझे एक नज़र आएगा, सुझाव के लिए धन्यवाद। – jbat100

+0

थोड़ा अलग दृष्टिकोण के साथ, क्यूटी ने एक समर्पित प्रीप्रोकैसिंग टूल (एमओसी <-> मेटा ऑब्जेक्ट कंपाइलर) के माध्यम से "सिग्नल और स्लॉट" लागू किया है। हालांकि, यह केवल तभी उपयोग करना उचित है जब qt ui आपकी आवश्यकताओं को फिट करे। –

उत्तर

1

बूट :: सिग्नल को देखने के लिए @ एनो की सिफारिश के बाद, यह परीक्षा के बाद संभव विकल्प की तरह प्रतीत होता है, हालांकि यह अपेक्षित है, उद्देश्य सी समाधान के रूप में सीधे आगे नहीं। boost::signal tutorial के माध्यम से देखकर, मैंने सोचा कि मैं समस्या के लिए सबसे प्रासंगिक पहलुओं से गुज़र जाऊंगा।


अधिसूचना प्रेषकों बनाने के लिए:

एक सरल खबर डिलीवरी सेवा है, जहां ग्राहकों को एक समाचार प्रदाता है कि उसके बाद सभी जुड़ा ग्राहकों को खबर भेजता है के रूप में जानकारी आता है से कनेक्ट पर विचार करें। खबर डिलीवरी सेवा इस तरह का निर्माण किया जा सकता है:

class NewsItem { /* ... */ }; 
boost::signal<void (const NewsItem&)> deliverNews; 

deliverNews का उद्देश्य पर्यवेक्षकों सूचित करना है कि एक NewsItem उत्पन्न किया गया है।


पर्यवेक्षकों (बढ़ावा :: बाँध लाइब्रेरी का उपयोग) के रूप में जोड़ा जा सकता है:

ग्राहकों कि समाचार अपडेट प्राप्त करना चाहते हैं केवल एक समारोह उद्देश्य यह है कि deliverNews के समाचार आइटम प्राप्त कर सकते हैं कनेक्ट की जरूरत है संकेत। उदाहरण के लिए, हम समाचार, जैसे ,:

struct NewsMessageArea : public MessageArea 
{ 
public: 
    // ... 

    void displayNews(const NewsItem& news) const 
    { 
    messageText = news.text(); 
    update(); 
    } 
}; 

// ... 
NewsMessageArea newsMessageArea = new NewsMessageArea(/* ... */); 
// ... 
deliverNews.connect(boost::bind(&NewsMessageArea::displayNews, newsMessageArea, _1)); 

पर्यवेक्षकों जो सूची से पुनः आवंटित की जाती किया गया है को दूर करने की समस्या से निबटने के लिए, को बढ़ावा देने के लिए विशेष रूप से हमारे आवेदन में एक विशेष संदेश क्षेत्र हो सकता है :: संकेत निम्नलिखित समाधान उपलब्ध कराता है

हालांकि, उपयोगकर्ता खबर संदेश क्षेत्र बंद कर देता है, तो, newsMessageArea उद्देश्य यह है कि deliverNews बारे में जानता है को नष्ट करने? सबसे अधिक संभावना है, सेगमेंटेशन गलती होगी। हालांकि, Boost.Signals के साथ केवल न्यूज़मेसेज एरिया को ट्रैक करने योग्य बनाता है, और स्लॉट न्यूज़ मैसेज एरिया को डिस्कनेक्ट किया जाएगा जब newsMessageArea नष्ट हो गया है।में ट्रैक करने योग्य वस्तुओं के प्रयोग के लिए एक महत्वपूर्ण सीमा है

struct NewsMessageArea : public MessageArea, public boost::signals::trackable 
{ 
    // ... 
}; 

इस समय: NewsMessageArea वर्ग बढ़ावा :: संकेतों :: ट्रैक करने योग्य वर्ग, जैसे से सार्वजनिक रूप से पाने से ट्रैक करने योग्य बनाया गया है स्लॉट कनेक्शन बनाना: बूस्ट का उपयोग करके निर्मित फ़ंक्शंस ऑब्जेक्ट्स को समझ लिया जाता है, जैसे पॉइंटर्स या संदर्भों को बढ़ावा देने के लिए पारित ट्रैक करने योग्य ऑब्जेक्ट्स :: बाइंड पाए जाएंगे और ट्रैक किए जाएंगे।

2

सिद्धांत आप एक वर्ग समारोह संकेत का एक वेक्टर है कि कॉल करने के लिए जब एक निश्चित अधिसूचना में कहा जाता है बना सकते में - एक वर्ग एक शब्दकोश जहां वस्तुओं कार्यों का वैक्टर करने पर एक सूचना

धकेल दिया जाता है कॉल करने के लिए कर रहे हैं कि
2

boost संकुल अन्य उत्तर में वर्णित के अलावा, एक और विकल्प poco::NotificationCenter है।

इस कार्यान्वयन कोको अधिसूचना ढांचे के करीब है, के रूप में विशेष रूप से पोको के documentation पर चर्चा की:

NotificationCenter वर्ग मूल रूप से NSNotificationCenter वर्ग एप्पल के कोको (या OpenStep) में पाई जाने वाली एक सी ++ कार्यान्वयन है।