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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 70
#1

Адаптер - C++

11.11.2013, 00:28. Просмотров 378. Ответов 8
Метки нет (Все метки)

Помогите, пожалуйста, подкорректировать последний 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     Адаптер
Посмотрите здесь:

Wi-Fi адаптер - C++
Вообщем хочу сделать программу для управления wi-fi адаптерами. Но незнаю с чего начать. На форуме не нашел упоминания об wi-fi . ...

класс-адаптер - C++
Добрый день, что такое класс-адаптер? как его можно использовать для доступа к пикселям изображения? заранее спасибо!

Адаптер функции bind() - C++
Читаю у Липпмана про адаптер bind, ...какие-то знакоместа. Компилятор на них ругается, я тоже. Вывести тип на создаваемый объект он тоже...

Wi fi адаптер - Ноутбуки
извините если что первый раз тут вдруг не там тему создал дело такое у меня завис ноутбук hp pavilion f6 2290sr вин8 я перезагрузил его и...

Wi-fi адаптер - Wi-Fi
Здравствуйте. У меня имеется адаптер TP-LINK TL-WN722NC Я хочу использовать его для квартиры, а именно для телефона и ноутбука. Я нашел...

Адаптер - Программирование Android
как добавлять данные в адаптер числовые и строковые значение мой код не правильный))) final ListView lv =...

Wi fi адаптер - Wi-Fi
у меня дома 2 компа,на 1 есть проводной интернет,а на другом нету друзья посоветовали что мне надо купить Wi fi адаптер ,я купил,но как им...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,454
Записей в блоге: 17
11.11.2013, 00:32     Адаптер #2
STL: не работает mem_fun_ref
Max Dark
шКодер самоучка
1813 / 1614 / 588
Регистрация: 09.10.2013
Сообщений: 3,618
Записей в блоге: 6
Завершенные тесты: 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
Сообщений: 70
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
шКодер самоучка
1813 / 1614 / 588
Регистрация: 09.10.2013
Сообщений: 3,618
Записей в блоге: 6
Завершенные тесты: 2
11.11.2013, 00:48     Адаптер #5
здесь использована lambda-функция
По сути дела здесь объявляется неименованая функция, которая принимает параметром указатель на текущий объект
Sublimee
7 / 7 / 0
Регистрация: 14.11.2012
Сообщений: 70
11.11.2013, 00:52  [ТС]     Адаптер #6
Цитата Сообщение от Cra3y Посмотреть сообщение
здесь использована lambda-функция
По сути дела здесь объявляется неименованая функция, которая принимает параметром указатель на текущий объект
А можно реализовать for_each используя mem_fun_ref_t?
Max Dark
шКодер самоучка
1813 / 1614 / 588
Регистрация: 09.10.2013
Сообщений: 3,618
Записей в блоге: 6
Завершенные тесты: 2
11.11.2013, 01:23     Адаптер #7
через mem_fun_ref_t не выйдет, так как ваш список содержит указатели на объекты, а не сами объекты
Можно было бы через mem_fun_t, но функция Shape:: Draw() имеет тип void, т.е. не возвращает значения
DU
1482 / 1058 / 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
Телевизор Samsung UE46D6100SW(RUS), купил адаптер WIS10ABGN, через программу All Share хотел посмотреть фильм с ПК, начинает показывать...

Wi-Fi адаптер - Ноутбуки
Купил ноутбук Acer aspire 5750G. Поставил драйвера что были на диске но для блютуса и для вайфая не ставились нормально, а выбивало...

wi-fi адаптер - Wi-Fi
Всем доброго времени суток, прошу прощения что пишу не в тот раздел Проблема у меня следующая: у моего соседа есть вай фай сеть, к нему я...

Адаптер и ListView - Программирование Android
Решил написать свой адаптер, работающий с listView. Беда в том, что программа вылетает сразу же. Вот код MainActivity: package...


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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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     Адаптер
Ответ Создать тему
Опции темы

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