C++ C++;和Qt:观察者模式错误
我正在尝试实现一个简单的观察者模式,用汽车模型的相关信息更新小部件。对于我的观察者模式的更新方法,我一直遇到一个相当复杂的错误,编译器似乎无法识别所传递的参数的类型。这是观察者的标题:C++ C++;和Qt:观察者模式错误,c++,qt,observer-pattern,C++,Qt,Observer Pattern,我正在尝试实现一个简单的观察者模式,用汽车模型的相关信息更新小部件。对于我的观察者模式的更新方法,我一直遇到一个相当复杂的错误,编译器似乎无法识别所传递的参数的类型。这是观察者的标题: #include "Subject.h" class Observer { public: virtual void update(Subject &car) = 0; }; 主题头文件: #include <QList> #include "Observer.h" clas
#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;
};
嗯。。。。什么??如您所见,编译器似乎认为update的参数是对int的引用。这是因为我的Observer头是抽象的吗?我还没有为它编写一个实现,所以也许这就是为什么?在
Observer
和Subject
之间有一个循环依赖关系。您可以通过在Observer.h
中向前声明Subject
而不是包含Subject.h
来避免它:
class Subject; // forward declaration
class Observer {
...
};
class Observer; // forward declaration
class Subject {
...
};
并在主题中执行相同操作。h
:
class Subject; // forward declaration
class Observer {
...
};
class Observer; // forward declaration
class Subject {
...
};
在
观察者
和主题
之间存在循环依赖关系。您可以通过在Observer.h
中向前声明Subject
而不是包含Subject.h
来避免它:
class Subject; // forward declaration
class Observer {
...
};
class Observer; // forward declaration
class Subject {
...
};
并在主题中执行相同操作。h
:
class Subject; // forward declaration
class Observer {
...
};
class Observer; // forward declaration
class Subject {
...
};
您有一个循环包含依赖项<代码>观察者包括
受试者
和受试者
包括观察者
。现在,标题保护将负责防止无限包含,但仍然必须首先包含其中一个标题,它们不能同时包含这两个标题。碰巧第一个要包含的是观察者
,此时主题
尚未声明
幸运的是,您似乎不需要任何这些内容。您可以用转发声明替换它们:
class Subject;
class Observer
{
public:
virtual void update(Subject &car) = 0;
};
您有一个循环包含依赖项<代码>观察者包括
受试者
和受试者
包括观察者
。现在,标题保护将负责防止无限包含,但仍然必须首先包含其中一个标题,它们不能同时包含这两个标题。碰巧第一个要包含的是观察者
,此时主题
尚未声明
幸运的是,您似乎不需要任何这些内容。您可以用转发声明替换它们:
class Subject;
class Observer
{
public:
virtual void update(Subject &car) = 0;
};
是否在定义观察者时声明了主题?是。我忘了为上面的Observer头添加include,虽然它已经在我的代码中了。它不在哪里?它位于观察者标题中。我刚忘了在这里添加它,但它在我的代码中。有点旁白,但你知道Qt的信号和插槽,对吗?这使得在不重新发明轮子的情况下实现observer模式变得非常简单。是的,现在我想起来了,使用您描述的信号和插槽来实现它可能会更容易。是否在您定义
observer
时声明了主题
?是的。我忘了为上面的Observer头添加include,虽然它已经在我的代码中了。它不在哪里?它位于观察者标题中。我刚忘了在这里添加它,但它在我的代码中。有点旁白,但你知道Qt的信号和插槽,对吗?这使得在不重新发明轮子的情况下实现观测者模式变得非常简单。是的,现在我想起来了,像你描述的那样,用信号和插槽实现它可能会更容易。我现在看到了。我犯了一个相当愚蠢的错误。我现在明白了。我犯了一个相当愚蠢的错误。