Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2

Как поместить в STL-контейнер экземпляры разных классов?

31.08.2016, 10:42. Показов 4129. Ответов 30

Студворк — интернет-сервис помощи студентам
Как поместить в контейнер экземпляры разных классов(типов) ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.08.2016, 10:42
Ответы с готовыми решениями:

Поместить экземпляры разных классов в один массив
Не пойму немного, это через List делается или иначе? Необходимо для дальнейшей сортировки и ограниченного вывода using System; using...

Как создать класс контейнер-динамический массив и поместить туда объекты других классов?
Какой тип массива использовать тип базового класса или наследников?

Создать экземпляры разных производных классов в зависимости от условий
нужно дописать программу. если длинна колесной базы равна 4500 и количество дверей - 2 тогда ето купе. В классе vehicle описать...

30
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
31.08.2016, 10:49
Цитата Сообщение от qppq
как запихать в контейнер экземпляры разных классов
Сделать для всех них родительский полиморфный класс и указатели на него пихать?
На счёт типов хз.
1
 Аватар для Martein
704 / 109 / 21
Регистрация: 22.06.2014
Сообщений: 241
31.08.2016, 10:58
Всё смешалось - люди, кони. Если приходиться прибегать к хранению объектов разных типов в одном контейнере, и тем более потом проверять их принадлежность к типу функцией std::dynamic_cast<T*>, то скорее всего архитектура построения зависимостей ваших классов продумана не совсем грамотно. Если это не налагает дополнительных расходов по пересмотрению, вроде переписывания всего проекта в целом, то не стоит прибегать к такой изощрённой схеме. Да и в случае чего отладка таких нагромождений будет достаточно тяжела. Но я в данном вопросе дилетант, так что другие гуру имеют полное право меня пнуть за моё невежество.
2
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
31.08.2016, 11:02  [ТС]
На счёт типов хз.
эээ, тип и класс экземпляра одно и то же, не так ли?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
31.08.2016, 11:08
Martein, Да нет, Вы всё правильно говорите( хоть я и не эксперт ). Просто я дал ТСу ответ на тот вопрос, который он задал, вернее, на часть вопроса.

Добавлено через 3 минуты
qppq, Ну тип может быть фундаментальным, например: int, char, double, etc. Это не классы и им нельзя приписать родителей. К классам из библиотеки STL, кстати, тоже нельзя. В общем можно только свои классы пихать, как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
///////////////////////////////////////////////////////////
#include <vector>
///////////////////////////////////////////////////////////
struct A
{
    virtual ~A() {};
};
 
struct B : A
{
    //some code
};
 
int main()
{
    std::vector< A* > vec;
    vec.push_back( new B() );
}
1
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
31.08.2016, 11:24
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

boost::any
std::any (std::experimental::any)
1
 Аватар для Babysitter
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
31.08.2016, 11:40
ну и есть классический костыль - заворачиваем в одну структуру enum и union.
1
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
31.08.2016, 12:23  [ТС]
HelicopterK52,
boost::any
std::any (std::experimental::any)
можете пояснить?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.08.2016, 20:23
Цитата Сообщение от qppq Посмотреть сообщение
можете пояснить?
Что не понятно то? Это части библиотек.

Идиомы С++. Type erasure
http://en.cppreference.com/w/cpp/experimental/any
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
31.08.2016, 23:32
C++
1
2
3
4
std::vector<void*> ve;
        ve.push_back((void*)new int(3));
        ve.push_back((void*)new std::string("hello"));
        std::cout<<*(int*)ve.at(0)<<" "<<*(std::string*)ve.at(1)<<std::endl;
а вообще раз уж пошла такая пьянка:

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
#include<boost/variant.hpp>
 
struct my_struct {
    friend std::ostream& operator<<(std::ostream& os, my_struct& t) {
        os<<"my_struct";
        return os;
    }
};
 
struct visit : public boost::static_visitor<>
{
    template<typename T>
    void operator()(T& t) const {
        std::cout<<t<<std::endl;
    }
};
 
int main() {
using variant = boost::variant<std::string, my_struct, int, float>;
        std::vector<variant> ve;
        ve.push_back(2.f);
        ve.push_back(1);
        ve.push_back(std::string("hello"));
        ve.push_back(my_struct{});
        std::for_each(std::begin(ve), std::end(ve), [=](auto el) {boost::apply_visitor(visit(), el);});
}
2
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
01.09.2016, 10:14  [ТС]
а как идентифицировать какой тип данных в ячейке при чтении из контейнера
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.09.2016, 10:25
Цитата Сообщение от qppq Посмотреть сообщение
а как идентифицировать какой тип данных в ячейке при чтении из контейнера
А полиморфные объекты на то и полиморфные чтобы ничего не идентифицировать. У них есть абстрактное действие/действия. Вызываешь для нужного/каждого как для абстрактного предка а каждый его выполняет по своему.
0
 Аватар для qppq
145 / 89 / 23
Регистрация: 31.08.2016
Сообщений: 780
Записей в блоге: 2
01.09.2016, 10:40  [ТС]
то есть нада помнить что-где лежит?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2016, 11:02
Цитата Сообщение от qppq Посмотреть сообщение
то есть нада помнить что-где лежит?
http://en.cppreference.com/w/c... l/any/type
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
01.09.2016, 11:09
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А полиморфные объекты на то и полиморфные чтобы ничего не идентифицировать.
А мне нравится когда можно идентифицировать.
Цитата Сообщение от qppq Посмотреть сообщение
то есть нада
использовать динамически типизированные языки типа Java и C#, и их instance of и is. Как в плюсах с этим, не знаю. Может any решает этот вопрос, не ясно ценой какого оверхеда.

ЗЫ о, пока набирал уже написали про type_id.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2016, 11:12
Цитата Сообщение от _Ivana Посмотреть сообщение
не ясно ценой какого оверхеда.
Какая может быть цена, если сам ничего руками не пишешь?
И согласен если не нужна типизация, то вероятно стоит подумать о том что бы встроить в программу что-то скриптовое например python или lua
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
01.09.2016, 11:16
Цитата Сообщение от Avazart Посмотреть сообщение
Какая может быть цена
За боксинг-анбоксинг и типоопределитинг. Например, делать структуру с указателем на void и полем char *typename - достаточно дорого, помимо выделения памяти и запаковки приходится строку читать и сравнивать.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2016, 11:25
Цитата Сообщение от _Ivana Посмотреть сообщение
делать структуру с указателем на void и полем char *typename - достаточно дорого
Вместо typename- typeid т.е. целое, а не строка.
И дорого в сравнении с чем? "Скрипты" под капотом ведь скорее всего поступают также.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
01.09.2016, 11:27
В сравнении с теми же приведенными instance of и is в Шарпе и Джаве. Там это не вручную скриптами под капотом и не либами поверх ядра, там это в самом ядре языка сделано и компилируется не в парсинг строкового имени типа.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2016, 11:29
Цитата Сообщение от _Ivana Посмотреть сообщение
там это в самом ядре языка сделано и компилируется не в парсинг строкового имени типа.
А ядро языка на чем пишется и как? обычно на Си и ровно так же...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.09.2016, 11:29
Помогаю со студенческими работами здесь

Как положить в массив экземпляры классов?
Здравствуйте! Есть задача. У меня есть 2 класса FixedMonthlyCostPaidService и FixedHourlyCostPaidService, которые считают среднемесячные...

Как использовать экземпляры классов МFC?
Такая проблема: С помощью MFC AppWizard создал проект, в котором редактируется некая древо-структура. Есть класс СMyDoc, который...

Как удалить элементы используя контейнер STL ?
здесь удаляется по одному элементу, (т.е. передаётся один итератор), а как удалить сразу несколько элементов(т.е. передать два итератора),...

Как считать из файла в контейнер STL (map)
Необходимо считать из файла с поместить в контейнер map, вывести на экран void DBase::DB() { ifstream fin(&quot;Park.txt&quot;); ...

Как сериализовать/десериализовать экземпляры классов в файл
Проблема следующая: Имеется три класcа: class Class1 { // Список полей и методов } class Class2 { // Список полей и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru