use*_*962 8 c++ templates iterator list observer-pattern
我一直在实现一个准确的观察者模式,并且陷入了一个有点神秘的错误:"成员引用基类型'Observer*'不是结构或联合".我认为这与我使用模板有关,我仍然相当不舒服.这是有问题的代码(为了简化事情,删除了大多数缺点/析构函数):
主题界面:
class Subject {
public:
virtual void notify();
private:
list< Observer * > m_observers;
};
Run Code Online (Sandbox Code Playgroud)
主题实施:
void Subject::notify() {
list< Observer * >::iterator i;
for ( i = m_observers.begin(); i != m_observers.end(); i++ ) {
*i->update( this ); // ERROR !!! ERROR
}
Run Code Online (Sandbox Code Playgroud)
观察者抽象界面:
class Observer {
public:
virtual ~Observer();
virtual void update( Subject * changedSubject ) = 0;
protected:
Observer();
};
Run Code Online (Sandbox Code Playgroud)
具体观察者界面:
class ConcreteObserver: public Observer {
public:
ConcreteObserver( ConcreteSubject * );
virtual ~ConcreteObserver();
virtual void update( Subject * changedSubject );
private:
ConcreteSubject * m_subject;
};
Run Code Online (Sandbox Code Playgroud)
具体观察者实施:
void ConcreteObserver::update( Subject * changedSubject ) {
if ( changedSubject == m_subject ) {
report();
}
}
Run Code Online (Sandbox Code Playgroud)
如果有人能帮助确定这个问题,我将不胜感激.
干杯,尼克
int*_*jay 12
问题在于运算符优先级.代替:
*i->update( this );
Run Code Online (Sandbox Code Playgroud)
使用:
(*i)->update( this );
Run Code Online (Sandbox Code Playgroud)
否则,它将被解释为*(i->update( this ))
,它试图在指针上调用方法,从而产生错误消息.
归档时间: |
|
查看次数: |
7631 次 |
最近记录: |