问题实施观察者模式:“成员参考基础类型________不是结构或联合”

时间:2011-07-13 18:04:16

标签: c++ list templates iterator observer-pattern

我一直在实现一个准确的观察者模式,并且陷入了一个有点神秘的错误: “成员参考基础类型'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 个答案:

答案 0 :(得分:12)

问题在于运营商的优先级。而不是:

*i->update( this );

使用:

(*i)->update( this );

否则,它将被解释为*(i->update( this )),它会尝试在指针上调用方法,从而产生错误消息。