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

Адаптер - C++

Восстановить пароль Регистрация
 
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 69
11.11.2013, 00:28     Адаптер #1
Помогите, пожалуйста, подкорректировать последний for_each, чтобы он ко всем элементам листа применил функцию Draw().

Класс Shape.
Содержит информацию о положении центра фигуры (координаты x и y).
Класс Circle производный от класса Shape. Реализует Draw
Класс Triangle производный от класса Shape. Реализует Draw
Класс Square производный от класса Shape. Реализует Draw

C++ (Qt)
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
#include <list>
#include <iostream>
#include <algorithm>
#include <functional>
#include <cstdlib>
#include <iomanip>
 
using namespace std;
 
class Shape {          
        public:
                int x;
                int y; // координаты центра
                bool IsMoreLeft(int x1) { // расположена ли данная фигура левее, чем фигура переданная в качестве аргумента
                        if (x < x1) {
                                return true;
                        } else {
                                return false;
                        }
                }
                bool IsUpper(int y1) { // расположена ли данная фигура выше, чем фигура переданная в качестве аргумента
                        if (y1 > y) {
                                return true;
                        } else {
                                return false;
                        }
                }
 
           virtual void Draw() = 0;
};
 
class Circle: public Shape {
public:
        Circle(int x1, int y1) {
                x = x1;
                y = y1;
        }
        void Draw() {
                cout << "Circle" << "x = " << x << "y = " << y << endl;
        }
       
};
 
class Triangle: public Shape {
public:
        Triangle(int x1, int y1) {
                x = x1;
                y = y1;
        }
        void Draw() {
                cout << "Triangle" << "x = " << x << "y = " << y << endl;
        }
};
 
class Square: public Shape {
public:
        Square(int x1, int y1) {
                x = x1;
                y = y1;
        }
        void Draw() {
                cout << "Square " << "x = " << x << "y = " << y << endl;
        }
};
 
 
 
int main() {
        list<Shape*> Our_shapes;
        for (int i = 0; i < 5; i++) {
        cout << "Select a shape" << endl;
        cout << "C - Circle" << endl;
        cout << "T - Triangle" << endl;
        cout << "S - Square" << endl;
        char c;
        cin >> c;
        if (c == 'C') {
                cout << "x = " ;
                int x1;
                cin >>  x1;
                cout << "y = " ;
                int y1;
                cin >>  y1;
                Circle C1(x1, y1);
                Our_shapes.push_back(&C1);
        }
        if (c == 'S') {
                cout << "x = " ;
                int x1;
                cin >>  x1;
                cout << "y = " ;
                int y1;
                cin >>  y1;
                Square S1(x1, y1);
                Our_shapes.push_back(&S1);
        }
        if (c == 'T') {
                cout << "x = " ;
                int x1;
                cin >>  x1;
                cout << "y = " ;
                int y1;
                cin >>  y1;
                Triangle T1(x1, y1);
                Our_shapes.push_back(&T1);
        }
        }
       
        list<Shape*>::iterator iter = Our_shapes.begin();
 
//      for_each(*(Our_shapes.begin()),*(Our_shapes.end()),mem_fun_ref_t<void,Shape>(Shape::Draw));
 
        return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2013, 00:28     Адаптер
Посмотрите здесь:

Windows 7 WI FI адаптер
wi-fi адаптер
Wi-Fi адаптер
Адаптер
C++ класс-адаптер
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,604
Записей в блоге: 17
11.11.2013, 00:32     Адаптер #2
STL: не работает mem_fun_ref
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
11.11.2013, 00:39     Адаптер #3
C++
1
2
3
for_each(Our_shapes.begin(),Our_shapes.end(),
                    [](Shape* s) -> void {
                        if(s) s->Draw(); });
Вроде так
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 69
11.11.2013, 00:44  [ТС]     Адаптер #4
Цитата Сообщение от Cra3y Посмотреть сообщение
C++
1
2
3
for_each(Our_shapes.begin(),Our_shapes.end(),
                    [](Shape* s) -> void {
                        if(s) s->Draw(); });
Вроде так
А можно пояснить как это работает?
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
11.11.2013, 00:48     Адаптер #5
здесь использована lambda-функция
По сути дела здесь объявляется неименованая функция, которая принимает параметром указатель на текущий объект
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 69
11.11.2013, 00:52  [ТС]     Адаптер #6
Цитата Сообщение от Cra3y Посмотреть сообщение
здесь использована lambda-функция
По сути дела здесь объявляется неименованая функция, которая принимает параметром указатель на текущий объект
А можно реализовать for_each используя mem_fun_ref_t?
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
11.11.2013, 01:23     Адаптер #7
через mem_fun_ref_t не выйдет, так как ваш список содержит указатели на объекты, а не сами объекты
Можно было бы через mem_fun_t, но функция Shape:: Draw() имеет тип void, т.е. не возвращает значения
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
11.11.2013, 02:12     Адаптер #8
а вам зачем форич?
я вот могу вспомнить мейерса, который говорил что это глядя на форич сразу понятно что тут для всех элементов
что-то делается. мол самодокументируемость и т.п. в простых вариантах, когда есть готовый функтор это
может быть и просто и наглядно, но когда в месте вызова начинают городить лямбды или комбайнить
адаптеры - вся простота и понятность исчезают.

вот сравните одно с другим:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for_each(Our_shapes.begin(),Our_shapes.end(),
                    [](Shape* s) -> void {
                        if(s) s->Draw(); });
 
 
// в c++03 цикл не сильно сложнее.
for (const auto& s : Our_shapes)
{
  if (s)
  {
    s->Draw();
  }
}
спорить ни с кем не хочу, просто обращаю внимание на то, что обычный фор часто выглядит проще
навороченного for_each + дебажится немного проще. если же цель использования for_each - заюзать
for_each - то тут вопросов нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2013, 10:17     Адаптер
Еще ссылки по теме:

Wi-fi адаптер. Ноутбук перестал находить адаптер.
C++ Wi-Fi адаптер
Wi-fi адаптер

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
11.11.2013, 10:17     Адаптер #9
Sublimee, у вас проблема была вот здесь:
C++
1
2
Circle C1(x1, y1);
Our_shapes.push_back(&C1);
Уважаемый вы же не выделяете память динамически под каждый объект списка. Нужно вот так:
C++
1
2
Shape* ptr = new Circle(x1, y1);
Our_shapes.push_back(ptr);
Алгоритм запишется тоже очень просто:
C++
1
for_each(Our_shapes.begin(), Our_shapes.end(), mem_fun(&Shape::Draw));
Вот вам подправленный код:
Кликните здесь для просмотра всего текста
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
#include <list>
#include <iostream>
#include <algorithm>
#include <functional>
#include <cstdlib>
#include <iomanip>
 
using namespace std;
 
class Shape {
        public:
                int x;
                int y; // координаты центра
                bool IsMoreLeft(int x1) { // расположена ли данная фигура левее, чем фигура переданная в качестве аргумента
                        if (x < x1) {
                                return true;
                        } else {
                                return false;
                        }
                }
                bool IsUpper(int y1) { // расположена ли данная фигура выше, чем фигура переданная в качестве аргумента
                        if (y1 > y) {
                                return true;
                        } else {
                                return false;
                        }
                }
 
           virtual void Draw() = 0;
};
 
class Circle: public Shape {
public:
        Circle(int x1, int y1) {
                x = x1;
                y = y1;
        }
        void Draw() {
                cout << "Circle" << "x = " << x << "y = " << y << endl;
        }
 
};
 
class Triangle: public Shape {
public:
        Triangle(int x1, int y1) {
                x = x1;
                y = y1;
        }
        void Draw() {
                cout << "Triangle" << "x = " << x << "y = " << y << endl;
        }
};
 
class Square: public Shape {
public:
        Square(int x1, int y1) {
                x = x1;
                y = y1;
        }
        void Draw() {
                cout << "Square " << "x = " << x << "y = " << y << endl;
        }
};
 
int main()
{
    list<Shape*> Our_shapes;
 
    for (int i = 0; i < 5; i++)
    {
        cout << "Select a shape" << endl;
        cout << "C - Circle" << endl;
        cout << "T - Triangle" << endl;
        cout << "S - Square" << endl;
        char c;
        cin >> c;
        int x1, y1;
        if (c == 'C') {
            cout << "x = " ;
            cin >>  x1;
            cout << "y = " ;
            cin >>  y1;
            Shape* ptr = new Circle(x1, y1);
            Our_shapes.push_back(ptr);
        }
        if (c == 'S') {
            cout << "x = " ;
            cin >>  x1;
            cout << "y = " ;
            cin >>  y1;
            Shape* ptr = new Square(x1, y1);
            Square S1(x1, y1);
            Our_shapes.push_back(ptr);
        }
        if (c == 'T') {
            cout << "x = " ;
            cin >>  x1;
            cout << "y = " ;
            cin >>  y1;
            Shape* ptr = new Triangle(x1, y1);
            Our_shapes.push_back(ptr);
        }
    }
 
    for_each(Our_shapes.begin(), Our_shapes.end(), mem_fun(&Shape::Draw));
 
    return 0;
}

P.S. STL очень мощная библиотека просто нужно научится ею пользоваться.
Yandex
Объявления
11.11.2013, 10:17     Адаптер
Ответ Создать тему
Опции темы

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