2012-06-12 90 views
0

我想实现一个简单的观察者模式来更新与汽车模型的相关信息的小部件。我一直在为Observer模式的更新方法收到一个相当复杂的错误,其中编译器似乎无法识别传递参数的类型。这是观察头:C++和Qt:观察者模式错误

#include "Subject.h" 

class Observer 
{ 
public: 

    virtual void update(Subject &car) = 0; 
}; 

主题的头文件:

#include <QList> 

#include "Observer.h" 

class Subject 
{ 
protected: 

    QList<Observer *> m_observers; 

public: 

    virtual void registerObserver(Observer &) = 0; 
    virtual void removeObserver(Observer &) = 0; 
    virtual void notifyObservers() = 0; 
}; 

为主题(Car类继承对象接口)而实现:

// 
// Subject interface implementation 
// 
void Car::registerObserver(Observer &observer) 
{ 
    m_observers.append(&observer); 
} 

void Car::removeObserver(Observer &observer) 
{ 
    int i = m_observers.indexOf(&observer); 

    if (i >= 0) 
     m_observers.removeAt(i); 
} 

void Car::notifyObservers() 
{ 
    for(int i = 0; i < m_observers.size(); ++i) 
     m_observers.at(i)->update(*this); 
} 

然而,编译器在notifyObservers方法中给我一个错误:

/home/dylan/Desktop/CarModel/Car.cpp:50: error: no matching function for call to ‘Observer::update(Subject&)’ 

candidate is: /home/dylan/Desktop/CarModel/Observer.h:11: virtual void Observer::update(int&) 

呃......什么?正如你所看到的,编译器似乎认为update的参数是对int的引用。这是因为我的Observer头是抽象的吗?我还没有为它写过一个实现,所以也许这是为什么?

+0

是否在您定义'Observer'的位置声明了'Subject'? –

+0

是的。我忘了为上面的Observer头添加include,尽管它已经在我的代码中了。我怀疑是 – dtg

+0

,事实并非如此。 –

回答

3

您在ObserverSubject之间有循环依赖关系。您可以通过前置声明SubjectObserver.h,而不是包括Subject.h避免:

class Subject; // forward declaration 

class Observer { 
    ... 
}; 

做同样的Subject.h

class Observer; // forward declaration 
class Subject { 
    ... 
}; 
+0

我现在看到它。这是我的一个非常愚蠢的错误。 – dtg

2

你有一个循环包括依赖。包括SubjectSubject包括Observer。现在头卫队会照顾防止无限包含,但仍然必须首先包含其中一个标题,但它们不能同时包含在内。它发生的第一个被包括的是Observer,并且在那个点上Subject尚未被声明。

幸运的是,你似乎并不需要任何这些包括。您可以用正向声明替换它们:

class Subject; 

class Observer 
{ 
public: 

    virtual void update(Subject &car) = 0; 
};