Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Композиция и Наследование классов Что это за ошибки и как их решить? https://www.cyberforum.ru/attachment.php?attachmentid=1064671&stc=1&d=1567621843 Employee.h #pragma once #include <cstdlib> #include <vector> #include... https://www.cyberforum.ru/ cpp-beginners/ thread2496778.html Задачка(шахматы) C++
На шахматной доске находятся черный король и две белых ладьи(ладьи бьет по горизонтали и вертикали). Проверить находится ли король под угрозой и если да, кто ему угрожает.
C++ Написать блок-схему https://www.cyberforum.ru/ cpp-beginners/ thread2496759.html
Добрый день,такое дело значит,дали мне задание по C++,но попросили нарисовать для начала блок-схему и что-то вот не доходит до меня,как правильно её нарисовать к этому заданию. Если не сложно...
C++ Определить, является ли одна последовательность циклическим сдвигом другой https://www.cyberforum.ru/ cpp-beginners/ thread2496757.html
Задано число N и две последовательности целых чисел длины N. Определить, является ли одна циклическим сдвигом другой. примеры: Можно использовать библиотеки iostream, string, vector, iomanip: 1)...
Задача D. Код да Винчи [C] C++
Имя входного файла: стандартный ввод Имя выходного файла: стандартный вывод Ограничение по времени: 1 секунда Ограничение по памяти: 256 мегабайт Профессор Роберт Лэнгдон, как обычно, попал в...
C++ Попадает ли точка в заштрихованную область? https://www.cyberforum.ru/ cpp-beginners/ thread2496735.html
Здравствуйте помогите написать код для прикрепленной картинки. Нужно чтобы заданная точка попадала в заштрихованную область.
C++ Решение задачи B: "Я знаю кунг-фу" [C] Задача B. Я знаю кунг-фу Имя входного файла: стандартный ввод Имя выходного файла: стандартный вывод Ограничение по времени: 0.5 секунд Ограничение по памяти: 256 мегабайт Морфеус и Нео... https://www.cyberforum.ru/ cpp-beginners/ thread2496726.html Вычисление арктангенса разложением в ряд (нужна блок-схема) C++
arctgx=Pi/2-1/x+1/3x^3-1/5x^5+... , x>1
C++ Упорядочить по убыванию два данных набора через ссылки Описать процедуру SortDec3(A, B, C), меняющую содержимое переменных A, B, C таким образом, чтобы их значения оказались упорядоченными по убыванию (A, B, C — вещественные параметры, являющиеся... https://www.cyberforum.ru/ cpp-beginners/ thread2496682.html C++ Написать программу Составить программу на C++, которая решит уравнение, X вводить с клавиатуры. Уравнение любое(1-12) https://www.cyberforum.ru/ cpp-beginners/ thread2496664.html
C++ Перегрузка операции извлечения из потока
подскажите, по заданию необходимо перегрузить операцию извлечения из потока >> для класса DoubleSubscriptedArray, чтобы она выводила массив. правильно ли я сделал и мне непонятно разве можно эту...
C++ Вычислить значение заданного выражения https://www.cyberforum.ru/ cpp-beginners/ thread2496625.html
немогу понять как решать такие формулы
1 / 1 / 0
Регистрация: 03.07.2016
Сообщений: 56
0

Изучаю паттерн Visitor - C++ - Ответ 13807497

04.09.2019, 22:29. Показов 1160. Ответов 5
Метки (Все метки)

Не могу до конца понять смысл и реализацию. Для изучения дан вот такой пример...

Кликните здесь для просмотра всего текста

На каждую операцию над объектами иерархии мы могли бы заводить по отдельному виртуальному методу, но такой подход при большом количестве операций приведёт к значительному увеличению размера кода. Вместо этого мы могли бы определить какой-нибудь универсальный интерфейс, который позволял бы реализовывать операции, не раздувая интерфейс классов.

Напечатаем все бинарные операции, используемые в выражении с помощью наследника класса Visitor...

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <iostream>
using namespace std;
 
struct Number;
struct BinaryOperation;
 
struct Visitor {
    virtual void visitNumber(Number const * number) = 0;
    virtual void visitBinaryOperation(BinaryOperation const * binary) = 0;
    virtual ~Visitor() { }
};
 
struct Expression
{
    
    virtual double evaluate() const = 0;
    virtual ~Expression()
    {
        cout << "Expression delete!..." << endl;
    }
    virtual void visit(Visitor * visitor) const = 0;
};
 
struct Number : Expression
{
    Number(double value)
        : value(value)
    {}
 
    ~Number()
    {
        cout << "Number delete!..." << endl;
    }
 
    double evaluate() const
    {
        return value;
    }
 
    void visit(Visitor * visitor) const 
    { 
        visitor->visitNumber(this); 
    }
 
    double get_value() const 
    { 
        return value; 
    }
 
private:
    double value;
};
 
struct BinaryOperation : Expression
{
    /*
      Здесь op это один из 4 символов: '+', '-', '*' или '/', соответствующих операциям,
      которые вам нужно реализовать.
     */
    BinaryOperation(Expression const * left, char op, Expression * right)
        : left(left), op(op), right(right)
    {}
 
    ~BinaryOperation()
    {
        cout << "BinaryOperation delete!..." << endl;
        delete left;
        delete right;
    }
 
    double evaluate() const
    {
        switch (op)
        {
 
        case '+':
            return left->evaluate() + right->evaluate();
            break;
 
        case '-':
            return left->evaluate() - right->evaluate();
            break;
 
        case '*':
            return left->evaluate() * right->evaluate();
            break;
 
        case '/':
            return left->evaluate() / right->evaluate();
            break;
        }
    }
 
    void visit(Visitor * visitor) const 
    { 
        visitor->visitBinaryOperation(this); 
    }
 
    Expression const * get_left()  const 
    { 
        return left; 
    }
    
    Expression const * get_right() const 
    { 
        return right; 
    }
    
    char get_op() const 
    { 
        return op; 
    }
 
private:
    Expression const * left;
    Expression const * right;
    char op;
};
 
struct PrintBinaryOperationsVisitor : Visitor {
    void visitNumber(Number const * number)
    { }
 
    void visitBinaryOperation(BinaryOperation const * bop)
    {
        bop->get_left()->visit(this);
        std::cout << bop->get_op() << " ";
        bop->get_right()->visit(this);
    }
};
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    //Expression const * expr = get_expression();
    Expression * expr = new BinaryOperation(new Number(4.5), '*', new Number(5));
    
    PrintBinaryOperationsVisitor visitor;
    expr->visit(&visitor);
 
    return 0;
}


Код в целом кажется понятным, кроме вот этого...

C++
1
bop->get_left()->visit(this);
Сказано, что...

Данный код рекурсивно обойдёт дерево, соответствующее арифметическому выражению,
и напечатает все бинарные операции в порядке обхода.
Как это работает??

Нашел задание для самостоятельной работы, сделал, а проверить некому. Посмотрите пожалуйста правильно написал или нет...

Кликните здесь для просмотра всего текста

Реализовать иерарxию классов геометрическиx фигур и иерарxию классов Visiter,
с помощью которой будет выводиться площадь этиx фигур.

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <iostream>
#include <math.h>
using namespace std;
 
struct Triangle;
struct Square;
struct Circle;
 
struct Visitor
{
    virtual void visitTriangle(Triangle *figure) = 0;
    virtual void visitSquare(Square *figure) = 0;
    virtual void visitCircle(Circle *figure) = 0;
};
 
struct Geometry
{
    virtual double get_figure_area() = 0;
    virtual void visit(Visitor *visitor) = 0;
};
 
struct Triangle : Geometry
{
    Triangle(double a, double b, double c)
        : a(a), b(b), c(c)
    {}
 
    double get_figure_area()
    {
        double p = (a + b + c) / 2;
        return sqrt(p*(p - a)*(p - b)*(p - c));
    }
 
    void visit(Visitor *visitor)
    {
        visitor->visitTriangle(this);
    }
 
    double a;
    double b;
    double c;
};
 
struct Square : Geometry
{
    Square(double a, double b)
        : a(a), b(b)
    {}
 
    double get_figure_area()
    {
        return a * b;
    }
 
    void visit(Visitor *visitor)
    {
        visitor->visitSquare(this);
    }
 
    double a;
    double b;
};
 
struct Circle : Geometry
{
    Circle(double r)
        : r(r)
    {}
 
    double get_figure_area()
    {
        return 3.14 * r * r;
    }
 
    void visit(Visitor *visitor)
    {
        visitor->visitCircle(this);
    }
 
    double r;
};
 
struct GetArea : Visitor
{
    void visitTriangle(Triangle *figure) 
    {
        cout << figure->get_figure_area() << endl;
    }
    
    void visitSquare(Square *figure)
    {
        cout << figure->get_figure_area() << endl;
    }
    
    void visitCircle(Circle *figure) 
    {
        cout << figure->get_figure_area() << endl;
    }
};
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    /*Реализовать иерарxию классов геометрическиx фигур и иерарxию классов Visiter, 
    с помощью которой будет выводиться площадь этиx фигур. То есть ваша функция 
    main будет выглядеть примерно так(напишите такой код, чтобы она выполнялась 
    и результатом вывода были бы площади соответствующиx фигур) :*/
 
        Geometry * geo;
        Triangle * tri = new Triangle(1, 1, 1);
        Square * sq = new Square(2, 2);
        Circle * cq = new Circle(3);
        geo = tri;
        GetArea viss;
        geo->visit(&viss);
        geo = sq;
        geo->visit(&viss);
        geo = cq;
        geo->visit(&viss);
    
    /*Geometry - базовый класс фигур.
    Triangle, Square, Circle - наследники Geometry.
    GetArea - наследник абстрактного класса Visit.*/
 
 
    return 0;
}


В заключении, может кто-нбудь поделится ссылкой на статью или видео с доступным объяснением!?

Вернуться к обсуждению:
Изучаю паттерн Visitor C++
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2019, 22:29
Готовые ответы и решения:

Паттерн Visitor для дерева
Есть у кого нибудь такой код? Буду благодарен!

Абстрактный класс Visitor С++
Пытаюсь создать абстрактный класс Visitor для работы с классом Expression, который представляет...

Паттерн Visitor
Для игры Реверс реализовать метод обхода доски перебирающий все эл-ты игрового поля и метод который...

Паттерн Visitor
Написал приложение для работы с бд. тема - кулинарная книга. 5 таблиц, можно добавить-удалить...

5
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2019, 22:29

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Почему паттерн абстрактная фабрика - паттерн уровня объектов, если в нём могут быть статические отношения?
Взято из Шевчук А., Охрименко Д., Касьянов А. Design Patterns via C#. Приемы...

По паттерну visitor
допустим, у меня есть Visitable с методом accept и Visitor с методом visit. Соответственно я пишу...

Returning Visitor (вовзраты) - 48% с AdWords - это нормально?
Всем доброго времени суток, с прошедшими и наступающими праздниками. Заинтересовал вот такой...

Если переменная visitor имеет значение "ВАСЯ", то...
Вот такое задание : greeting=(visitor==&quot;ВАСЯ&quot;)?&quot;Привет Вася &quot;:&quot;Привет&quot;; Если переменная...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.