я получаю ошибку типа наблюдателя не может быть решена, когда наблюдатель является классом - PullRequest
0 голосов
/ 21 марта 2019

У меня проблема с использованием предварительно написанного кода шаблона проектирования obvserver для C ++.В методе attach говорится, что тип Observer не может быть разрешен, когда он объявлен как класс.Может кто-нибудь помочь мне решить эту проблему?У меня также есть другая проблема с views.push_back в этом методе.Выдает ошибку «Недопустимые аргументы, кандидаты void push_back (Observer * const &)».Я новичок в C ++ и не совсем понимаю эти ошибки.

#include <iostream>
#include <vector>
using namespace std;

class Subject {
    // 1. "independent" functionality
    vector < class Observer * > views; // 3. Coupled only to "interface"
    int value;
  public:
    void attach(Observer *obs) {
        views.push_back(obs);
    }
    void setVal(int val) {
        value = val;
        notify();
    }
    int getVal() {
        return value;
    }
    void notify();
};

class Observer {
    // 2. "dependent" functionality
    Subject *model;
    int denom;
  public:
    Observer(Subject *mod, int div) {
        model = mod;
        denom = div;
        // 4. Observers register themselves with the Subject
        model->attach(this);
    }
    virtual void update() = 0;
  protected:
    Subject *getSubject() {
        return model;
    }
    int getDivisor() {
        return denom;
    }
};

void Subject::notify() {
  // 5. Publisher broadcasts
  for (int i = 0; i < views.size(); i++)
    views[i]->update();
}

class DivObserver: public Observer {
  public:
    DivObserver(Subject *mod, int div): Observer(mod, div){}
    void update() {
        // 6. "Pull" information of interest
        int v = getSubject()->getVal(), d = getDivisor();
        cout << v << " div " << d << " is " << v / d << '\n';
    }
};

class ModObserver: public Observer {
  public:
    ModObserver(Subject *mod, int div): Observer(mod, div){}
    void update() {
        int v = getSubject()->getVal(), d = getDivisor();
        cout << v << " mod " << d << " is " << v % d << '\n';
    }
};

1 Ответ

0 голосов
/ 21 марта 2019

Проблема в том порядке, в котором вы объявили свои классы. Класс Subject использует класс Observer, но впоследствии было объявлено Observer, поэтому, когда компилятор пытается скомпилировать Subject, он не знает, что такое Observer. Однако, поскольку Subject также использует Observer, вы не можете просто изменить порядок объявления.

Ответ на эту загадку заключается в предварительном объявлении class Observer, так что по крайней мере компилятор знает, что Observer является классом, даже если он не знает о нем много. Добавьте class Observer; перед вашим class Subject определением. Вы также можете удалить слово class из вашего векторного объявления.

class Observer;

class Subject {
    // 1. "independent" functionality
    vector < Observer * > views; // 3. Coupled only to "interface"
    ...
...