2012-06-12 97 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; 
};