Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;和Qt:观察者模式错误_C++_Qt_Observer Pattern - Fatal编程技术网

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的信号和插槽,对吗?这使得在不重新发明轮子的情况下实现观测者模式变得非常简单。是的,现在我想起来了,像你描述的那样,用信号和插槽实现它可能会更容易。我现在看到了。我犯了一个相当愚蠢的错误。我现在明白了。我犯了一个相当愚蠢的错误。