Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 01:37   #1
sasharu9
 
Регистрация: 28.04.2010
Сообщений: 5
По умолчанию патттерн Observer(Непонятна часть кода) С++

Непонятный код в одном месте. Хотелось бы узнать смысл и для чего его тут написали.
Код:
class Subject {
    // 1. "independent" functionality
    vector < class Observer * > views; // Вот эта строка непонятна
    int value;
  public:
    void attach(Observer *obs) {
        views.push_back(obs);   // эта тоже . Функция не объявлена нигде а её вызывают.
    }
    void setVal(int val) {
        value = val;
        notify();
    }
    int getVal() {
        return value;
    }
    void notify();
};
А вот код всей проги:
Сама прога взята с сайта /*http://sourcemaking.com/ */ . Прога компелируется, но почемуто консоль не фиксируется.
Код:
#include<stdafx.h>
#include <iostream>
#include <vector>
using namespace std;
 
class Subject {
    // 1. "independent" functionality
    vector < class Observer * > views; // Вот эта строка непонятна
    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';
    }
};
 
int main() {
        int a;
        system("pause");
  Subject subj;
  DivObserver divObs1(&subj, 4); // 7. Client configures the number and
  DivObserver divObs2(&subj, 3); //    type of Observers
  ModObserver modObs3(&subj, 3);
  subj.setVal(14);
  system("pause");
  cin>>a;
}
sasharu9 вне форума Ответить с цитированием
Старый 09.12.2010, 03:58   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,823
По умолчанию

Код:
vector < class Observer * > views; // Вот эта строка непонятна
Объявление вектора. Читать раздел учебника про STL.

Код:
views.push_back(obs);   // эта тоже . Функция не объявлена нигде а её вызывают.
Врете! См. <vector>
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распознавание Аски кода и скан кода MyLastHit Общие вопросы Delphi 8 06.12.2010 18:34
Err207 непонятна причина Jaaq Паскаль, Turbo Pascal, PascalABC.NET 10 15.04.2009 14:48
Помогите, пожалуйста, реализовать часть кода Horknee Паскаль, Turbo Pascal, PascalABC.NET 2 01.12.2008 23:30
Часть фона одним цветом а другая часть другим (без таблиц). Lanselot HTML и CSS 4 25.04.2008 18:41
Выдернуть куски кода из html-кода trafbite Помощь студентам 7 18.08.2007 13:51