Проблема реализации шаблона наблюдателя: «Базовый тип ссылки на элемент ________ не является структурой или объединением» - PullRequest
8 голосов
/ 13 июля 2011

Я реализовал шаблон наблюдателя barebones и застрял на несколько загадочной ошибке: «Базовый тип ссылки на элемент« Observer * »не является структурой или объединением».Я предполагаю, что это как-то связано с моим использованием шаблонов, с которым мне все еще довольно неудобно.Вот код ошибки (большинство минусов / деструкторов убрано для упрощения):

Тематический интерфейс:

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();
    }
}

Если кто-то может помочь выявить эту проблему, я был бы очень признателен.

Ура, Ник

1 Ответ

12 голосов
/ 13 июля 2011

Проблема с приоритетом оператора. Вместо:

*i->update( this );

Использование:

(*i)->update( this );

В противном случае он будет интерпретирован как *(i->update( this )), который пытается вызвать метод для указателя, что приводит к сообщению об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...