2010-06-13 14 views
7

कहते हैं कि मैं इन कक्षाओं ViewA और ViewBसी ++ में कोई घटनाक्रम/प्रतिनिधि/इंटरफेस/अधिसूचनाएं हैं! कुछ भी?

उद्देश्य सी में प्रतिनिधि पैटर्न का उपयोग कर मैं तो ViewB इंटरफ़ेस में

@protocol ViewBDelegate{ 

- (void) doSomething(); 
} 

कर सकता है:

id<ViewBDelegate> delegate; 

तो ViewA कार्यान्वयन में मैं सेट प्रतिनिधि:

viewB.delegate = self; 

और अब मैं कुछ भी अज्ञात प्रकार के प्रतिनिधियों पर viewB से कुछ कर सकता हूं।

[delegate doSomething]; 

"सी ++ कैसे इस कार्यक्रम के लिए" बदतर पढ़ एक सरल उदाहरण है कि मूल डिजाइन पैटर्न को दर्शाता है नहीं मिल सकता है किया गया है।

क्या मैं सी ++ में तलाश कर रहा हूँ है:

  • घटनाओं ActionScript और जावा
  • या प्रतिनिधियों या उद्देश्य सी में NSNotifications

कुछ भी है कि कक्षा एक की अनुमति देता है, कक्षा बी और कक्षा सी को यह जानने के लिए कि क्लासएक्स किया कुछ() !!!

धन्यवाद

उत्तर

9

यदि मैं आप थे, तो मैं इस कार्य को पूरा करने के लिए फ़ंक्शन पॉइंटर्स का उपयोग नहीं करता। इस विकल्प को गुरुओं को छोड़ दें;)

बूस्ट में, signals नामक एक सुंदर लाइब्रेरी है। यह आपके जीवन को आसान बनाता है!

#include <iostream> 
#include <boost/bind.hpp> 
#include <boost/signal.hpp> 
using namespace std; 
using namespace boost; 

struct A 
{ void A_action() { cout << "A::A_action();" << endl; } }; 
struct B 
{ void B_action() { cout << "B::B_action();" << endl; } }; 
struct C 
{ void C_action() { cout << "C::C_action();" << endl; } }; 
struct X 
{ 
    // Put all the functions you want to notify! 
    signal<void()> list_of_actions; 
    void do_something() 
    { 
     std::cout << "Hello I am X!" << endl; 
     list_of_actions(); // send notifications to all functions in the list! 
    } 
}; 
int main() 
{ 
    X x; 
    A a; 
    B b; 
    C c; 
    x.list_of_actions.connect(bind(&A::A_action, a)); 
    x.list_of_actions.connect(bind(&B::B_action, b)); 
    x.list_of_actions.connect(bind(&C::C_action, c)); 
    x.do_something(); 
} 

यह प्रिंट होगा:

Hello I am X! 
A::A_action(); 
B::B_action(); 
C::C_action(); 

यह ऐसे काम करता है यह प्रयोग का एक उदाहरण है।

signal<void()> list_of_actions; 

उसके बाद, आप यह कार्य/functors/प्रतिदेय चीजों में से जो भी समूह आप कॉल करना चाहते करने के लिए "कनेक्ट":

सबसे पहले, आप जगह है कि प्रतिनिधियों रखती घोषणा करते हैं।

x.list_of_actions.connect(bind(&A::A_action, a)); 
x.list_of_actions.connect(bind(&B::B_action, b)); 
x.list_of_actions.connect(bind(&C::C_action, c)); 

नोट, कि मैंने bind का उपयोग किया है। इसलिए, list_of_actions में फ़ंक्शंस का प्रकार समान है, लेकिन हम इसे विभिन्न प्रकार के वर्गों से कनेक्ट कर सकते हैं। तो:

bind(&A::A_action, a) 

यह बात है, एक प्रतिदेय बात, प्रकार void() के रूप में हम list_of actions के प्रकार के पहले घोषित पैदा करता है। बेशक, आप इस पैरामीटर को दूसरे पैरामीटर में लागू करना चाहते हैं ..

यदि आप बहु-थ्रेडेड सामान कर रहे हैं, तो अपनी बहन signals2 का उपयोग करें।

उम्मीद है कि मदद करता है।

+0

समय लेने और उदाहरण जोड़ने के लिए अराक धन्यवाद। जो मेरी खोज निष्कर्ष निकाला है। प्रतिभाशाली! – Bach

+0

एक शानदार उत्तर। – Ross

2

कोई प्रतिनिधि/घटनाएं/आदि नहीं हैं।

आप शुद्ध वर्चुअल फ़ंक्शन का उपयोग करके इंटरफेस अनुकरण कर सकते हैं, एक समान प्रश्न के लिए here देखें।

और वहाँ function pointers रहे हैं ...

तो मूल रूप से करने के लिए इस सवाल का जवाब आप सवाल यह है कि नहीं, कि सी में से कोई भी कर रहे हैं ++ (नवीनतम मानक के बारे में पता नहीं है), लेकिन वहाँ के विकल्प और कामकाज से जुड़े हैं ..

+0

धन्यवाद मैं इंटरफ़ेस कार्यान्वयन की जांच करूँगा जो करना चाहिए। – Bach

1

न तो सी ++ भाषा, न ही इसकी संबंधित मानक लाइब्रेरी, या तो प्रतिनिधि या घटनाएं हैं। निश्चित रूप से ऐसी कई चीजें हैं जो ऐसी चीजों को लागू करती हैं, या आप उन्हें स्वयं लागू कर सकते हैं।

+0

धन्यवाद नील। मुझे वास्तव में भाषा सीखना मुश्किल लगता है, मुझे एहसास हुआ कि उद्देश्य सी और पायथन कितना खराब हो सकता है! – Bach

+2

@ बाच किसी भी भाषा को सीखते समय, यह महत्वपूर्ण है कि आप जानते हैं कि अन्य भाषाओं से मेम को ले जाने की कोशिश न करें। सी ++ वास्तव में पायथन की तरह कुछ भी नहीं है - मैं उद्देश्य सी के बारे में बात नहीं कर सकता हूं और ध्यान दें कि आप सी ++ में प्रतिनिधिमंडल कर सकते हैं - यह सिर्फ भाषा का हिस्सा नहीं है। –

+0

मैं नील से सहमत हूं हालांकि मैं इसकी मदद नहीं कर सकता, क्योंकि मुझे पता है कि मैं वास्तव में क्या करना चाहता हूं, और मैं देखता हूं कि मैंने अन्य भाषाओं में यह कैसे किया है, इसलिए मैंने स्वाभाविक रूप से सी ++ में समकक्ष खोजने की कोशिश की। मुझे लगता है कि सीखने और सीखने का सभी हिस्सा। यहां सभी सुझाव देखेंगे। स्टैकओवरफ्लो ने किसी भी भाषा, सूचनात्मक और पेशेवरों से भरे किसी भी पुस्तक को पढ़ा है। सबको धन्यवाद। – Bach

1

सभी मुझे पता है वहाँ विधि का एक प्रकार है कहा जाता कॉल-बैक विधि (वास्तव में, समारोह सूचक)।

प्रतिनिधिमंडल? यह सिर्फ लिपटे कॉल-बैक विधि का एक प्रकार है, और, उन्नत लग रहा है

+0

धन्यवाद rhapsodyn। मुझे लगता है कि मैंने मंजूरी के लिए उन्नत लिया। उद्देश्य सी से आने वाले सी ++ के बारे में कुछ भी सुरुचिपूर्ण नहीं है, वैसे भी मदद के लिए धन्यवाद। – Bach

5

कुछ भी है कि कक्षा एक की अनुमति देता है, कक्षा बी और कक्षा सी पता चला है कि ClassX didSomething() !!!

शायद आप signals & slots लिए देख रहे हैं, जो कई कार्यान्वयन है:

मुझे यकीन है कि वहाँ और अधिक कर रहे हैं, लेकिन इनमें से सबसे महत्वपूर्ण हैं जो मुझे पता है।

1

"सी ++ कैसे इस कार्यक्रम के लिए" बदतर पढ़ एक सरल उदाहरण है कि मूल डिजाइन पैटर्न

मुझे लगता है कि the original Design Patterns book कैसे सी ++ का उपयोग कर प्रत्येक पैटर्न को लागू करने के उदाहरण भी शामिल है को दर्शाता है नहीं मिल सकता है किया गया है।

2

व्यक्तिगत रूप से मुझे सर्गेई रियाज़ानोव द्वारा The Impossibly Fast C++ Delegates पसंद है। बहुत साफ और उपयोग करने में आसान कार्यान्वयन, Boost::function से तेज़ होने का दावा किया गया।

आप वहां भी लागू कार्यक्रमों को पा सकते हैं। हालांकि, मैं उनका उपयोग नहीं करता हूं। मैंने .NET शैली (प्रेषक, तर्क) का उपयोग करके अपना खुद का ईवेंट हैंडलिंग लागू किया।

+0

यह देखने लायक है कि लाइटवेट जेनेरिक सी ++ कॉलबैक (या फिर भी एक और प्रतिनिधि कार्यान्वयन)] (http://www.codeproject.com/Articles/136799/Lightweight-Generic-C- कॉलबैक- या- Yet- अन्य- डेल)। –

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