При применении шаблона наблюдателя произошла ошибка - PullRequest
0 голосов
/ 30 июня 2018

У меня есть следующий код:

class ISubscriber;
class News {
public:
    float getVersion() { return this->version; }
    void setVersion(float state) { this->version= state; this->notifyAllSubscribers(); }
    void attach(ISubscriber *observer) { this->subscribers.push_back(observer); }
    void notifyAllSubscribers() {
        for (vector<ISubscriber*>::iterator it = subscribers.begin(); it != subscribers.end(); it++){
            (*(*it)).update();
        }
    }
private:
    vector<ISubscriber*> subscribers;
    float version;
};

class ISubscriber {
public:
    News *news;
    virtual void update() = 0;
};

class Subscriber1 : public ISubscriber {
public:
    Subscriber1(News *news) { this->news = news; this->news->attach(this); }
    void update() override { cout << "Subscriber1: A new version of the newspaper has been launched (v" << this->news->getVersion() << ")" << endl; }

};

class Subscriber2 : public ISubscriber {
public:
    Subscriber2(News *news) { this->news = news; this->news->attach(this); }
    void update() override { cout << "Subscriber2: A new version of the newspaper has been launched (v" << this->news->getVersion() << ")" << endl; }

};


int main(int argc, char *argv[]) {
    News newspaper;
    newspaper.setVersion(2.1f);

    Subscriber1 sb1(&newspaper);
    Subscriber2 sb2(&newspaper);
    return 0;
}

Но произошли странные ошибки:

Первая ошибка указывает на этот код (*(*it)).update(); в news классе. Почему произошли эти ошибки, в чем причина?

1 Ответ

0 голосов
/ 30 июня 2018

(*(*it)).update(); требует, чтобы тип ISubscriber был завершен, просто предварительного объявления недостаточно.

Вы можете переместить определение ISubscriber перед значением News и дать предварительное объявление News до этого.

class News;
class ISubscriber {
public:
    News *news;
    virtual void update() = 0;
};

class News {
public:
    float getVersion() { return this->version; }
    void setVersion(float state) { this->version= state; this->notifyAllSubscribers(); }
    void attach(ISubscriber *observer) { this->subscribers.push_back(observer); }
    void notifyAllSubscribers() {
        for (vector<ISubscriber*>::iterator it = subscribers.begin(); it != subscribers.end(); it++){
            (*(*it)).update();
        }
    }
private:
    vector<ISubscriber*> subscribers;
    float version;
};
...