2011-07-13 13 views
8

मैं एक बेयरबोन पर्यवेक्षक पैटर्न को कार्यान्वित कर रहा हूं और कुछ हद तक गुप्त त्रुटि पर फंस गया हूं: "सदस्य संदर्भ आधार प्रकार 'पर्यवेक्षक *' है संरचना या संघ नहीं "। मुझे लगता है कि इसका टेम्पलेट्स के उपयोग के साथ कुछ करना है, जिसके साथ मैं अभी भी काफी असहज हूं।पर्यवेक्षक पैटर्न कार्यान्वित करने में समस्या: "सदस्य संदर्भ आधार प्रकार ________ संरचना या संघ नहीं है"

विषय इंटरफ़ेस::

class Subject { 
public: 
    virtual void notify(); 
private: 
    list< Observer * > m_observers; 
}; 

विषय कार्यान्वयन:

void Subject::notify() { 
    list< Observer * >::iterator i; 

    for (i = m_observers.begin(); i != m_observers.end(); i++) { 
     *i->update(this);      // ERROR !!! ERROR 
} 

ऑब्जर्वर सार इंटरफ़ेस:

class Observer { 
public: 
    virtual ~Observer(); 
    virtual void update(Subject * changedSubject) = 0; 

protected: 
    Observer(); 
}; 
यहाँ अपमानजनक कोड (सबसे विपक्ष/चीजों को आसान बनाने के लिए हटा दिया विनाशकर्ता) है

कंक्रीट पर्यवेक्षक इंटरफेस:

class ConcreteObserver: public Observer { 

public: 
    ConcreteObserver(ConcreteSubject *); 
    virtual ~ConcreteObserver(); 

    virtual void update(Subject * changedSubject); 

private: 
    ConcreteSubject * m_subject; 
}; 

कंक्रीट ऑब्जर्वर कार्यान्वयन:

void ConcreteObserver::update(Subject * changedSubject) { 
    if (changedSubject == m_subject) { 
     report(); 
    } 
} 

किसी को भी मदद कर सकता है यदि इस समस्या की पहचान है, मैं बहुत यह जानना चाहेंगे।

चीयर्स, निक

+0

क्या आपने '(* i) -> अपडेट (यह);'? – Vlad

उत्तर

12

समस्या ऑपरेटर पूर्वता के साथ है। बजाय:

*i->update(this); 

उपयोग:

(*i)->update(this); 

अन्यथा, यह *(i->update(this)) के रूप में व्याख्या की जाएगी, जो एक सूचक पर एक विधि कॉल करने, त्रुटि संदेश में जिसके परिणामस्वरूप कोशिश करता है।

+0

अह्ह्ह। धन्यवाद interjay, महान काम करता है। मुझे अब यह याद है, एक कॉम्प विज्ञान व्याख्यान से वापस जब। इस बार बेहतर रहना चाहिए। – user810962

+0

धन्यवाद, इससे मुझे उद्देश्य-सी में मदद मिली! – hellozimi

+0

मैं भी, मैं संदर्भ द्वारा एक ऑब्जेक्ट पास कर रहा था और जब मैंने अपनी संपत्तियों को सेट करने का प्रयास किया तो मुझे उपरोक्त त्रुटि मिली। तो * referencedObject.name = @ "ब्रूस" को एक त्रुटि मिली, (* संदर्भित ऑब्जेक्ट) .name = @ "ब्रूस" ठीक है। असल में, नहीं, मुझे मिली त्रुटि "अर्थपूर्ण समस्या: सदस्य संदर्भ आधार प्रकार 'गुड क्लास * __ ऑटोरेलीज़िंग *' संरचना या संघ नहीं है"। लेकिन समाधान फिर भी काम करता है। –

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