Форум программистов, компьютерный форум CyberForum.ru

паттерн Observer(непонятна строка кода) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
/*Alexander*/
5 / 5 / 0
Регистрация: 29.04.2010
Сообщений: 88
09.12.2010, 00:57     паттерн Observer(непонятна строка кода) #1
Непонятный код в одном месте. Хотелось бы узнать смысл и для чего его тут написали.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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/ */ . Прога компелируется, но почемуто консоль не фиксируется.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2010, 00:57     паттерн Observer(непонятна строка кода)
Посмотрите здесь:

C++ Пропускается строка кода
Непонятна ошибка C++
C++ Непонятна часть кода программы - работа с файлами
C++ Строка кода
паттерн и строка C++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.12.2010, 01:06     паттерн Observer(непонятна строка кода) #2
/*Alexander*/, Читайте про вектор, Сэр. А потом лезьте в паттерны. Изучите STL для начала.

Добавлено через 2 минуты
vector < class Observer * > views; // Вот эта строка непонятна
Объявляется вектор указателей на Observer с именем views.
void attach(Observer *obs) {
views.push_back(obs); // эта тоже . Функция не объявлена нигде а её вызывают.
Вызывается стандартная функция вектора push_back по названию можно понять что она делает. Ну и добавляет она в вектор указатель на Observer.
Ну и для окончания.Вектор
/*Alexander*/
5 / 5 / 0
Регистрация: 29.04.2010
Сообщений: 88
09.12.2010, 02:02  [ТС]     паттерн Observer(непонятна строка кода) #3
ДА спосибо этот ответ. Это твоя ссылка (там зазобраться долговато, нет пока времени). Здавать завтро. Ты скажешь почему так плохо отнёсся к теме. Тему паттерны должны изучать только в следующем семе, не говаря уже про как ты сказал вектор, От тебя первый раз услышал.


Что эта функция возвращает????

Добавлено через 10 минут
ForEveR, Скажи программа сама раскравает суть паттерна Observer

Добавлено через 3 минуты
ForEveR, Почему консоль сразу исчезает, после вызова. Я даже написал system("pause") и нихрена.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.12.2010, 07:53     паттерн Observer(непонятна строка кода) #4
/*Alexander*/, Не знаю. У меня не закрывается. В паттерны я не лезу. Я нормально отнесся к теме, просто изучать нужно более-менее последовательно, как ни странно.
push_back не возвращает ничего. Она добавляет элемент в конец контейнера...
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
09.12.2010, 10:27     паттерн Observer(непонятна строка кода) #5
Согласен с тов. ForEveR. В другой теме я тебе уже писал, что если программировать правильно, то получатся паттерны, а если программировать паттернами, то не факт, что получится правильно.
Тебе сейчас надо не паттерны изучать, а алгоритмы.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.12.2010, 12:39     паттерн Observer(непонятна строка кода) #6
Цитата Сообщение от volovzi Посмотреть сообщение
если программировать правильно, то получатся паттерны, а если программировать паттернами, то не факт, что получится правильно
Золотые слова!
Yandex
Объявления
09.12.2010, 12:39     паттерн Observer(непонятна строка кода)
Ответ Создать тему
Опции темы

Текущее время: 13:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru