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

<list> - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 5.00
Padonok
 Аватар для Padonok
14 / 14 / 1
Регистрация: 01.02.2009
Сообщений: 23
28.04.2010, 14:05     <list> #1
Подскажите как вызвать функцию объекта помещенного в список?
У меня есть абстрактный класс Book от него производный класс Science
list<Book*>book;

Book * science = new Science();

Всем полям присвоил значение

book.push_back(science);

У меня в классе есть функция вывод на экран всех значеней полей print()
Как обратиться к функции print со списка? (типо science->print() )
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hell Knight
 Аватар для Hell Knight
230 / 84 / 3
Регистрация: 11.03.2010
Сообщений: 290
28.04.2010, 14:21     <list> #2
а попробуй так:
C++
1
book[i].print();
я незнаю как с list, но с vector
вроде так можно обращаться...
Padonok
 Аватар для Padonok
14 / 14 / 1
Регистрация: 01.02.2009
Сообщений: 23
28.04.2010, 14:31  [ТС]     <list> #3
Цитата Сообщение от Hell Knight Посмотреть сообщение
а попробуй так:
C++
1
book[i].print();
я незнаю как с list, но с vector
вроде так можно обращаться...
не работает (
Hell Knight
 Аватар для Hell Knight
230 / 84 / 3
Регистрация: 11.03.2010
Сообщений: 290
28.04.2010, 14:47     <list> #4
а можно код, как это всё объявляется ?
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
28.04.2010, 15:31     <list> #5
C++
1
2
3
4
5
6
std::set<Book *>::iterator it = sel_k.begin();
while (it != sel_k.end())
{
    (*it)->print();
    it++;
}
Padonok
 Аватар для Padonok
14 / 14 / 1
Регистрация: 01.02.2009
Сообщений: 23
28.04.2010, 16:39  [ТС]     <list> #6
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#include <iostream>
#include <algorithm>
#include <list>
#include <string>
#include <windows.h>
 
using namespace std;
 
 
class DATA{
public:
    void SetName(string name) { itsName = name;}
    void SetYear(int year)    { itsYear = year;}
    void SetPrice(int price) { itsPrice = price;}
    void SetAuthor(string author) { itsAuthor = author;} 
    string GetName() { return itsName;}
    void print();
private:
    string itsName;
    string itsAuthor;
    int itsYear;
    int itsPrice;
};
void DATA::print(){
    cout << "Name: " << itsName << endl;
    cout << "Author: " << itsAuthor << endl;
    cout << "Year: " << itsYear << endl;
    cout << "Price: " << itsPrice << endl;
}
 
class Book{
public:
    virtual void SetName(string name)=0; // имя книги
    virtual void SetYear(int year)=0; // год издания книги
    virtual void SetPrice(int price)=0; // цена книги
    virtual void SetAuthor(string author)=0; // автор книги
    virtual string GetName()=0;
    virtual void print()=0; // вывод
};
 
class Science : public Book{
public:
    void SetName(string name) { data.SetName(name); }
    void SetYear(int year) { data.SetYear(year); }
    void SetPrice(int price) { data.SetPrice(price); }
    void SetAuthor(string author) { data.SetAuthor(author); }
    string GetName() { return data.GetName(); }
    void print() { data.print(); }
 
protected:
    DATA data;
};
 
class Directory : public Science{
public:
    void SetType(string type) { itsType = type;} // Словарь, Энциклопедия
    void display() { cout << "Type: " << itsType << endl;}
private:
    string itsType;
 
};
 
class Fiction : public Book{
public:
    void SetName(string name) { data.SetName(name); }
    void SetYear(int year) { data.SetYear(year); }
    void SetPrice(int price) { data.SetPrice(price); }
    void SetAuthor(string author) { data.SetAuthor(author); }
    string GetName() { return data.GetName(); }
    void print() { data.print(); }
 
protected:
    DATA data;
};
 
class Drama : public Fiction{
public:
    void SetType(string type) { itsType = type;} // тип текста: Проза, Роман, Стих
    void SetPeriod(string period) { itsPeriod = period; } // литература по периодам: Античная, Средневековья, Ренессанс, Модерн, Постмодерн
    void display() { cout << "Type: "  << itsType << endl;
                     cout << "Period: " << itsPeriod << endl; 
    }
private:
    string itsType;
    string itsPeriod;
};
 
 
int main(){
    setlocale( LC_ALL,"Russian" );
    list<Book*>book;//список
    list<Book*>::iterator p;
    bool menu = true;
    int year;
    int price;
    string name;
    string author;
 
    
    while(menu){
        int choice;
        system("cls");
        system("color A");
        cout << "*****Меню*****\n";
        cout << "(1)Создать объект\n";
        cout << "(2)Удалить объект\n";
        cout << "(3)Изменить параметры объекта\n";
        cout << "(4)Вывод\n";
        cout << "(5)Выход\n";
        cout << endl;
        cin >> choice;
        switch(choice){
            case 1:{
                system("cls");
                cout << "*****Меню*****\n";
                cout << "(1)Создать Science\n";
                cout << "(2)Создать Directory\n";
                cout << "(3)Создать Fiction\n";
                cout << "(4)Создать Drama\n";
                cout << "(5)Выход\n";
                cin >> choice;
                switch(choice){
                    case 1: {
                        Book * science = new Science();
                        cout << "Название книги: ";
                        cin >> name;
                        science->SetName(name);
                        cout << "\nАвтор: ";
                        cin >> author;
                        science->SetAuthor(author);
                        cout << "\nГод издания: ";
                        cin >> year;
                        science->SetYear(year);
                        cout << "\nЦена: ";
                        cin >> price;
                        science->SetPrice(price);
                        book.push_back(science);// помещения объекта в список
                        
                    }
                    break;
                    case 2: {
                        Book * directory = new Directory();
                        cout << "Название книги: ";
                        cin >> name;
                        directory->SetName(name);
                        cout << "\nАвтор: ";
                        cin >> author;
                        directory->SetAuthor(author);
                        cout << "\nГод издания: ";
                        cin >> year;
                        directory->SetYear(year);
                        cout << "\nЦена: ";
                        cin >> price;
                        directory->SetPrice(price);
                        book.push_back(directory);
                             
                    }
                    break;
                    case 3: {
                        Book * fiction = new Fiction();
                        cout << "Название книги: ";
                        cin >> name;
                        fiction->SetName(name);
                        cout << "\nАвтор: ";
                        cin >> author;
                        fiction->SetAuthor(author);
                        cout << "\nГод издания: ";
                        cin >> year;
                        fiction->SetYear(year);
                        cout << "\nЦена: ";
                        cin >> price;
                        fiction->SetPrice(price);
                        book.push_back(fiction);
                             
                    }
                    break;
                    case 4: {
                        Book * drama = new Drama();
                        cout << "Название книги: ";
                        cin >> name;
                        drama->SetName(name);
                        cout << "\nАвтор: ";
                        cin >> author;
                        drama->SetAuthor(author);
                        cout << "\nГод издания: ";
                        cin >> year;
                        drama->SetYear(year);
                        cout << "\nЦена: ";
                        cin >> price;
                        drama->SetPrice(price);
                        book.push_back(drama);
                             
                    }
                    break;
                   case 5: break;
                }
            }
                
                   
            case 2: {
                int tmp = book.empty();
                if(tmp){ // проверка наличия объектов в списке
                    cout << "Список объектов пустой" << endl;
                    Sleep(1000);
                }
                
 
            }
                    break;
            case 3: break;
            case 4: {
                int tmp = book.empty();
                if(tmp){ // проверка наличия объектов в списке
                    cout << "Созданных объектов нет" << endl;
                    Sleep(1000);
                }
                else{
                    
                    Sleep(1000);
                }
 
            }
                    break;
            case 5: menu = false; break;
            default: {
                cout << "Попробуйте еще раз\n"; 
                     Sleep(1000);
            }
                     break;
        }
    }
    
    return 0;
}
Добавлено через 26 минут
Цитата Сообщение от Roma_F Посмотреть сообщение
C++
1
2
3
4
5
6
std::set<Book *>::iterator it = sel_k.begin();
while (it != sel_k.end())
{
    (*it)->print();
    it++;
}

спасибо)))

Добавлено через 41 минуту
А как можно реализовать удаление со списка по имени книги.
C++
1
2
3
4
5
6
7
8
9
10
11
12
cout << "Имя книги: ";
string N,T;
cin >> N;
list<Book*>::iterator it=book.begin();
while(it != book.end()){
     T=(*it)->GetName();
     if(T == N){
        cout << "ok" << endl;
    book.erase(it);
     }
     it++;
}
Оно то удаляет но после удаления программа рушится (((
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
28.04.2010, 18:10     <list> #7
должно работать
C++
1
2
3
4
5
6
7
8
9
10
while(it != book.end()){
     T=(*it)->GetName();
     if(T == N){
        cout << "ok" << endl;
        delete *it;
        book.erase(it);
        break;
     }
     it++;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2010, 21:33     <list>
Еще ссылки по теме:

Работа с STL list + пропись List.h C++
Реализация std::list, сложность list::size() C++
C++ Преобразование списка list в *list

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

Или воспользуйтесь поиском по форуму:
Padonok
 Аватар для Padonok
14 / 14 / 1
Регистрация: 01.02.2009
Сообщений: 23
28.04.2010, 21:33  [ТС]     <list> #8
Цитата Сообщение от Roma_F Посмотреть сообщение
должно работать
C++
1
2
3
4
5
6
7
8
9
10
while(it != book.end()){
     T=(*it)->GetName();
     if(T == N){
        cout << "ok" << endl;
        delete *it;
        book.erase(it);
        break;
     }
     it++;
}
благодарен за помощь
Yandex
Объявления
28.04.2010, 21:33     <list>
Ответ Создать тему
Опции темы

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