車のモデルに関連する情報でウィジェットを更新する単純なオブザーバー パターンを実装しようとしています。オブザーバー パターンの更新メソッドでかなり厄介なエラーが発生し続けます。コンパイラは、渡されるパラメーターの型を認識できないようです。これは Observer のヘッダーです。
#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 ヘッダーが抽象的であるためですか? 私はまだその実装を書いていないので、おそらくこれが理由ですか?