2011-07-13 13 views
8

Bir barebones gözlemcisi modeli uyguluyordum ve biraz şifreli bir hataya takılıyorum: "Üye referans tabanı türü 'Gözlemci *' dir bir yapı veya birlik değil. Bunun hala oldukça rahatsız olduğum şablonlar kullanmamla ilgili bir şey olduğunu varsayalım.Sorun Uygulayan Gözlemci Deseni: "Üye başvuru tabanı türü ________ bir yapı veya birleşim değil"

Konu arayüzü:

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

Konu uygulanması:

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

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

Gözlemci soyut arayüzü:

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

protected: 
    Observer(); 
}; 
İşte kusurlu kodu (şeyler basitleştirmek için kaldırıldı çoğu eksileri/yok ediciler) 'dir

Beton Gözlemcisi arayüzü:

class ConcreteObserver: public Observer { 

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

    virtual void update(Subject * changedSubject); 

private: 
    ConcreteSubject * m_subject; 
}; 

Beton Gözlemci uygulaması: herkes bu sorunu tanımlamaya yardımcı olsaydı

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

, ben çok iyi olur.

Alkış,

+0

'ı (* i) -> güncelleştirmeyi denediniz mi (bu);'? – Vlad

cevap

12

Nick sorun operatör önceliği olduğunu. Onun yerine:

*i->update(this); 

Kullanımı:

(*i)->update(this); 

Aksi halde *(i->update(this)) olarak yorumlanacaktır, hata iletisinde sonuçlanan bir işaretçi bir yöntemi çağırmak çalışır.

+0

Ahhhh. Teşekkürler interjay, harika çalışıyor. Bunu şimdi hatırlıyorum, ne zaman bir arkeoloji dersinden. Bu sefer daha iyi olmalı. – user810962

+0

Teşekkürler, bu bana Objective-C'de yardımcı oldu! – hellozimi

+0

Bende, bir nesneyi referans olarak geçiriyordum ve özelliklerini ayarlamaya çalıştığımda yukarıdaki hatayı aldım. Yani * namedObject.name = @ "Bruce" bir hata aldı, (* referenceObject) .name = @ "Bruce" iyi. Aslında hayır, aldığım hata "Semantik Sorun: Üye referans tabanı türü" GoodClass * __ autoreleasing * 'bir yapı veya birleşim değildir ". Ancak çözüm yine de işe yarıyor. –

İlgili konular