Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 24.12.2018
Сообщений: 6

Как реализовать в коде RTTI

21.05.2023, 20:23. Показов 644. Ответов 9

Студворк — интернет-сервис помощи студентам
Всем привет, прошу помочь, подскажите как и где мне лучше было бы реализовать RTTI в данном коде
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
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
#include <iostream>
#include <string>
#include <vector>
#include <limits>
#include <stdexcept>
using namespace std;
 
class Brand {
private:
    string brand_name;
 
public:
    Brand(const string& brand_name) : brand_name(brand_name) {}
    string get_brand_name() const { return brand_name; }
    void set_brand_name(const string& brand_name) { this->brand_name = brand_name; }
};
 
template <typename PriceType>
class ClothingItem {
protected:
    string name;
    PriceType price;
    int size;
    string color;
    Brand brand;
 
public:
    ClothingItem(string name, PriceType price, int size, string color, Brand brand)
        : name(name), price(price), size(size), color(color), brand(brand) {}
    virtual ~ClothingItem() {}
 
    string get_name() const { return name; }
    PriceType get_price() const { return price; }
    int get_size() const { return size; }
    string get_color() const { return color; }
    Brand get_brand() const { return brand; }
 
    void set_brand(const Brand& brand) { this->brand = brand; }
    void set_name(const string& name) { this->name = name; }
    void set_price(PriceType price) { this->price = price; }
    void set_size(int size) { this->size = size; }
    void set_color(const string& color) { this->color = color; }
 
    virtual void print_description() const = 0;
 
    friend ostream& operator<<(ostream& os, const ClothingItem<PriceType>& item) {
        item.print_description();
        return os;
    }
};
 
template <typename PriceType>
class Shirt : public ClothingItem<PriceType> {
private:
    int collar_size;
public:
    Shirt(string name, PriceType price, int size, string color, Brand brand, int collar_size)
        : ClothingItem<PriceType>(name, price, size, color, brand), collar_size(collar_size) {}
 
    int get_collar_size() const { return collar_size; }
    void set_collar_size(int collar_size) { this->collar_size = collar_size; }
 
    void print_description() const override {
        cout << "Рубашка \"" << this->name << "\", " << this->price << " руб., " << this->size << " размер, " << this->color << " цвет, " << this->brand.get_brand_name() << " бренд, " << collar_size << " размер воротника" << endl;
    }
};
 
template <typename PriceType>
class Pants : public ClothingItem<PriceType> {
private:
    int inseam;
public:
    Pants(string name, PriceType price, int size, string color, Brand brand, int inseam)
        : ClothingItem<PriceType>(name, price, size, color, brand), inseam(inseam) {}
 
    int get_inseam() const { return inseam; }
    void set_inseam(int inseam) { this->inseam = inseam; }
 
    void print_description() const override {
        cout << "Брюки \"" << this->name << "\", " << this->price << " руб., " << this->size << " размер, " << this->color << " цвет, " << this->brand.get_brand_name() << " бренд, " << inseam << " длина шагового шва" << endl;
    }
};
 
template <typename PriceType>
class Accessory : private ClothingItem<PriceType> {
private:
    string type;
public:
    Accessory(string name, PriceType price, int size, string color, Brand brand, string type)
        : ClothingItem<PriceType>(name, price, size, color, brand), type(type) {}
 
    string get_type() const { return type; }
    void set_type(const string&type) { this->type = type; }
    void print_description() const override {
        cout << "Аксессуар \"" << this->name << "\", " << this->price << " руб., " << this->size << " размер, " << this->color << " цвет, " << this->brand.get_brand_name() << " бренд, тип: " << type << endl;
    }
};
 
class Catalog {
private:
    vector<ClothingItem<double>*> items;
public:
    Catalog() {}
    ~Catalog() {
        for (auto item : items) {
            delete item;
        }
    }
    void add_item(ClothingItem<double>* item) {
        items.push_back(item);
    }
    
    double get_total_price() const {
        double total_price = 0.0;
        for (int i = 0; i < items.size(); i++) {
            total_price += items[i]->get_price();
        }
        return total_price;
    }
 
    void remove_item(int index) {
        delete items[index];
        items.erase(items.begin() + index);
    }
 
    int get_size() const { return items.size(); }
 
    ClothingItem<double>* get_item(int index) const {
        return items[index];
    }
 
    friend ostream& operator<<(ostream& os, const Catalog& catalog) {
        os << "Каталог одежды:" << endl;
        for (int i = 0; i < catalog.get_size(); ++i) {
            os << *catalog.get_item(i);
        }
        return os;
    }
};
 
void show_menu(Catalog& catalog) {
    int choice = 0;
    bool done = false;
    while (!done) {
        cout << endl << "Выберите действие:" << endl;
        cout << "1. Показать список элементов каталога" << endl;
        cout << "2. Добавить рубашку" << endl;
        cout << "3. Добавить брюки" << endl;
        cout << "4. Добавить аксессуар" << endl;
        cout << "5. Изменить элемент каталога" << endl;
        cout << "6. Удалить элемент каталога" << endl;
        cout << "7. Выйти" << endl;
 
        try {
            cin >> choice;
            if (cin.fail()) {
                cin.clear();
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                throw invalid_argument("Ошибка ввода. Введите число.");
            }
        switch (choice) {
            case 1: {
                cout << catalog;
                break;
            }
            case 2: {
                string name;
                double price;
                int size;
                string color;
                string brand_name;
                int collar_size;
                cout << "Введите название рубашки: ";
                cin >> name;
                cout << "Введите цену рубашки: ";
                cin >> price;
                cout << "Введите размер рубашки: ";
                cin >> size;
                cout << "Введите цвет рубашки: ";
                cin >> color;
                cout << "Введите название бренда рубашки: ";
                cin >> brand_name;
                cout << "Введите размер воротника рубашки: ";
                cin >> collar_size;
catalog.add_item(new Shirt<double>(name, price, size, color, Brand(brand_name), collar_size));
                break;
            }
            case 3: {
                string name;
                double price;
                int size;
                string color;
                string brand_name;
                int inseam;
 
                cout << "Введите название брюк: ";
                cin >> name;
                cout << "Введите цену брюк: ";
                cin >> price;
                cout << "Введите размер брюк: ";
                cin >> size;
                cout << "Введите цвет брюк: ";
                cin >> color;
                cout << "Введите название бренда брюк: ";
                cin >> brand_name;
                cout << "Введите длину шагового шва брюк: ";
                cin >> inseam;
 
                catalog.add_item(new Pants<double>(name, price, size, color, Brand(brand_name), inseam));
                break;
            }
            case 4: {
                string name;
                double price;
                int size;
                string color;
                string brand_name;
                string type;
 
                cout << "Введите название аксессуара: ";
                cin >> name;
                cout << "Введите цену аксессуара: ";
                cin >> price;
                cout << "Введите размер аксессуара: ";
                cin >> size;
                cout << "Введите цвет аксессуара: ";
                cin >> color;
                cout << "Введите название бренда аксессуара: ";
                cin >> brand_name;
                cout << "Введите тип аксессуара: ";
                cin >> type;
 
                catalog.add_item(new Accessory<double>(name, price, size, color, Brand(brand_name), type));
                break;
            }
            case 5: {
            int index;
            cout << "Введите индекс элемента каталога для изменения: ";
            cin >> index;
 
            if (index >= 0 && index < catalog.get_size()) {
                ClothingItem<double>* item = catalog.get_item(index);
 
                cout << "Текущее описание элемента: ";
                item->print_description();
 
                string name;
                double price;
                int size;
                string color;
                string brand_name;
 
                cout << "Введите новое название: ";
                cin >> name;
                cout << "Введите новую цену: ";
                cin >> price;
                cout << "Введите новый размер: ";
                cin >> size;
                cout << "Введите новый цвет: ";
                cin >> color;
                cout << "Введите новое название бренда: ";
                cin >> brand_name;
 
                item->set_name(name);
                item->set_price(price);
                item->set_size(size);
                item->set_color(color);
                item->set_brand(Brand(brand_name));
                cout << "Описание элемента после изменения: ";
                item->print_description();
            } else {
                cout << "Недопустимый индекс элемента." << endl;
            }
 
            break;
        }
        case 6: {
            int index;
            cout << "Введите индекс элемента каталога для удаления: ";
            cin >> index;
            if (index >= 0 && index < catalog.get_size()) {
                catalog.remove_item(index);
                cout << "Элемент удален из каталога." << endl;
            } else {
                cout << "Недопустимый индекс элемента." << endl;
            }
 
            break;
        }
        case 7: {
            cout << "До свидания!" << endl;
            done = true;
            break;
        }
        default: {
            cout << "Недопустимый выбор." << endl;
            break;
        }
    }
}
catch (const invalid_argument& e) {
            cout << e.what() << endl;
        } catch (const exception& e) {
            cout << "Произошла ошибка: " << e.what() << endl;
        }
    }
}
 
int main() {
    setlocale(LC_ALL, "Russian");
    Catalog catalog;
    // Добавление элементов в каталог
    catalog.add_item(new Shirt<double>("Рубашка 1", 1500, 42, "белый", Brand("Hugo Boss"), 38));
    catalog.add_item(new Pants<double>("Брюки 1", 2000, 48, "серый", Brand("Armani"), 80));
    catalog.add_item(new Shirt<double>("Рубашка 2", 1700, 40, "голубой", Brand("Tommy Hilfiger"), 36));
    catalog.add_item(new Pants<double>("Брюки 2", 2200, 50, "черный", Brand("Gucci"), 82));
    // Отображение меню и обработка команд пользователя
    show_menu(catalog);
 
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.05.2023, 20:23
Ответы с готовыми решениями:

вместо механизма RTTI языка C++ используйте свою собственную модель RTTI
В примере вместо механизма RTTI языка C++ используйте свою собственную модель RTTI. Включите в базовый класс виртуальную функцию whatAmI()...

реализовать rtti
здравствуйте, возможно ли реализовать rtti собственноручно с помощью макросов, но более-менее просто(не как здесь предлагалось:...

Как включить RTTI
Подскажите пожалуйста как активизировать RTTI в Visual Studio 2013

9
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
21.05.2023, 20:47
для начала ошибку надо исправить, а то не скомпилится
Цитата Сообщение от Niykee1337 Посмотреть сообщение
class Accessory : privatepublic ClothingItem<PriceType> {

а вопрос непонятен. RTTI используется, если это нужно. И он тут используется
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
21.05.2023, 20:47
Цитата Сообщение от Niykee1337 Посмотреть сообщение
реализовать в коде RTTI
Что значит "реализовать RTTI"? RTTI - это свойство языка. Оно уже реализовано. Она вас чем-то не устраивает и вы хотите реализовать свое?
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
21.05.2023, 20:48
Цитата Сообщение от Niykee1337 Посмотреть сообщение
string get_name() const { return name; }
PriceType get_price() const { return price; }
int get_size() const { return size; }
string get_color() const { return color; }
Brand get_brand() const { return brand; }
void set_brand(const Brand& brand) { this->brand = brand; }
void set_name(const string& name) { this->name = name; }
void set_price(PriceType price) { this->price = price; }
void set_size(int size) { this->size = size; }
void set_color(const string& color) { this->color = color; }
мусора очень много. Я бы лучше поля сделал public, а всё это удалил
0
0 / 0 / 0
Регистрация: 24.12.2018
Сообщений: 6
21.05.2023, 20:52  [ТС]
Алексей1153, Ну,нужно реализовать динамическое приведение типов через dynamic_cast тут, вот не знаю как сделать
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
21.05.2023, 20:53
Niykee1337, а где нужно то? Определись, где нужно (и зачем) - да сделай
0
0 / 0 / 0
Регистрация: 24.12.2018
Сообщений: 6
21.05.2023, 21:01  [ТС]
Алексей1153, ну вот я и спрашиваю как раз, где мне лучше его сделать?

Добавлено через 6 минут
Алексей1153, Мне просто нужно еще реализовать приватное наследование в коде, подскажите как правильно его сделать?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.05.2023, 23:01
Концепция RTTI - захваченный ресурс инициализирован не соответствует своей формулировке как и почти всё в мире псевдоматематики. Этот термин внутренне означает, что объект должен сам позаботиться о инициализации и деинициализации на протяжении своего жизненного цикла (вначале и в конце как правило). А язык явно предоставляет инструменты - конструктор/деструктор.
Но у вас используются библиотечные классы, которые, это делают автоматически. Если бы вы сами выделяли память под символьные строки, в конструкторах, а потом сами же её освобождали в деструкторе, это значило бы RTTI своими руками.
Но вот тут:
C++
1
2
3
4
5
6
virtual void print_description() const = 0;
 
    friend ostream& operator<<(ostream& os, const ClothingItem<PriceType>& item) {
        item.print_description();
        return os;
    }
и
C++
1
2
3
void print_description() const override {
        cout << "Брюки \"" << this->name << "\", " << this->price << " руб., " << this->size << " размер, " << this->color << " цвет, " << this->brand.get_brand_name() << " бренд, " << inseam << " длина шагового шва" << endl;
    }
обнаруживается не соответствие концепции вывода в поток, здравому смыслу.
Если бы как-то:
C++
1
2
3
4
5
6
virtual void print_description() const = 0;
 
    friend ostream& operator<<(ostream& os, const ClothingItem<PriceType>& item) 
    {        
        return  item.print_description();
    }
и, скажем:
C++
1
2
3
4
5
ostream& print_description(ostream& os) const override 
   {
         return os<< "Брюки \"" << this->name << "\", " << this->price << " руб., " << this->size << " размер, " << this->color 
         << " цвет, " << this->brand.get_brand_name() << " бренд, " << inseam << " длина шагового шва" << endl;
    }
то может и могло бы иметь место использование разных потоков (вплоть до вывода в файл).
Не спешите использовать термины прежде осмысливания их сути.
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
22.05.2023, 06:49
Цитата Сообщение от IGPIGP Посмотреть сообщение
захваченный ресурс инициализирован
это ты путаешь с RAII
Цитата Сообщение от IGPIGP Посмотреть сообщение
захваченный ресурс инициализирован
и там вот так: "захват ресурса является инициализацией"

----------------
RTTI - это динамическая идентификация типа данных
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.05.2023, 19:28
Цитата Сообщение от Алексей1153 Посмотреть сообщение
это ты путаешь с RAII
каюсь, - прочел плохо, а потом ещё и собственноручно повторил.
Хех... Бывает же такое. Дюже спать хотел вчера)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.05.2023, 19:28
Помогаю со студенческими работами здесь

как можно реализовать это в коде?
Здравствуйте. Если вам не трудно скажите как можно в коде реализовать это: Вариантов множество. Например, заводится массив с указателями...

Как реализовать рекурсию в приведенном коде
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Feil { ...

Как реализовать деструктор в данном коде?
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...

Как реализовать данную формулу в коде?
Вычислить значение выражения, содержащего сумму и произведение p.s. я может и сам решу её,просто я не могу с формулой...

Как реализовать в коде Equal и Tostring
]class Matrix { @Override public boolean equals(Object obj) { return false; } ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru