0

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

4

2 に答える 2

3

との間に循環依存関係がObserverありSubjectます。を含める代わりに前方宣言することで回避できSubjectます。Observer.hSubject.h

class Subject; // forward declaration

class Observer {
  ...
};

で同じことを行いSubject.hます:

class Observer; // forward declaration
class Subject {
  ...
};
于 2012-06-12T18:02:51.413 に答える
2

循環的なインクルード依存関係があります。をObserver含みます。これでヘッダー ガードが無限のインクルードを防止しますが、ヘッダーの 1 つを最初にインクルードする必要があり、両方を同時にインクルードすることはできません。含まれる最初のものはであり、その時点ではまだ宣言されていません。SubjectSubjectObserverObserverSubject

幸いなことに、これらのインクルードは必要ないようです。それらを前方宣言に置き換えることができます。

class Subject;

class Observer
{
public:

    virtual void update(Subject &car) = 0;
};
于 2012-06-12T18:04:07.810 に答える