0

我正在尝试实现一个简单的观察者模式来更新带有汽车模型相关信息的小部件。我的观察者模式的更新方法不断收到一个相当令人困惑的错误,编译器似乎无法识别所传递参数的类型。这是观察者的标题:

#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;
};

Subject 的实现(类 Car 继承 Subject 接口):

//
// 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。您可以通过前向声明SubjectObserver.h不是包括来避免它Subject.h

class Subject; // forward declaration

class Observer {
  ...
};

并在下面做同样的事情Subject.h

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

您有一个循环包含依赖项。Observer包括SubjectSubject包括Observer。现在标题保护将负责防止无限包含,但仍然必须首先包含一个标题,它们不能同时包含。碰巧要包含的第一个是Observer,此时Subject尚未声明。

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

class Subject;

class Observer
{
public:

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