Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 777
1

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

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

Author24 — интернет-сервис помощи студентам
Как поместить в контейнер экземпляры разных классов(типов) ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2016, 10:42
Ответы с готовыми решениями:

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

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

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

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

30
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
31.08.2016, 10:49 2
Цитата Сообщение от qppq
как запихать в контейнер экземпляры разных классов
Сделать для всех них родительский полиморфный класс и указатели на него пихать?
На счёт типов хз.
1
698 / 105 / 19
Регистрация: 22.06.2014
Сообщений: 234
31.08.2016, 10:58 3
Всё смешалось - люди, кони. Если приходиться прибегать к хранению объектов разных типов в одном контейнере, и тем более потом проверять их принадлежность к типу функцией std::dynamic_cast<T*>, то скорее всего архитектура построения зависимостей ваших классов продумана не совсем грамотно. Если это не налагает дополнительных расходов по пересмотрению, вроде переписывания всего проекта в целом, то не стоит прибегать к такой изощрённой схеме. Да и в случае чего отладка таких нагромождений будет достаточно тяжела. Но я в данном вопросе дилетант, так что другие гуру имеют полное право меня пнуть за моё невежество.
2
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 777
31.08.2016, 11:02  [ТС] 4
На счёт типов хз.
эээ, тип и класс экземпляра одно и то же, не так ли?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
31.08.2016, 11:08 5
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 6
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

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

Идиомы С++. Type erasure
http://en.cppreference.com/w/cpp/experimental/any
1
42 / 42 / 17
Регистрация: 25.04.2014
Сообщений: 499
31.08.2016, 23:32 10
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
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 777
01.09.2016, 10:14  [ТС] 11
а как идентифицировать какой тип данных в ячейке при чтении из контейнера
0
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
01.09.2016, 10:25 12
Цитата Сообщение от qppq Посмотреть сообщение
а как идентифицировать какой тип данных в ячейке при чтении из контейнера
А полиморфные объекты на то и полиморфные чтобы ничего не идентифицировать. У них есть абстрактное действие/действия. Вызываешь для нужного/каждого как для абстрактного предка а каждый его выполняет по своему.
0
144 / 88 / 23
Регистрация: 31.08.2016
Сообщений: 777
01.09.2016, 10:40  [ТС] 13
то есть нада помнить что-где лежит?
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2016, 11:02 14
Цитата Сообщение от qppq Посмотреть сообщение
то есть нада помнить что-где лежит?
http://en.cppreference.com/w/c... l/any/type
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
01.09.2016, 11:09 15
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А полиморфные объекты на то и полиморфные чтобы ничего не идентифицировать.
А мне нравится когда можно идентифицировать.
Цитата Сообщение от qppq Посмотреть сообщение
то есть нада
использовать динамически типизированные языки типа Java и C#, и их instance of и is. Как в плюсах с этим, не знаю. Может any решает этот вопрос, не ясно ценой какого оверхеда.

ЗЫ о, пока набирал уже написали про type_id.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2016, 11:12 16
Цитата Сообщение от _Ivana Посмотреть сообщение
не ясно ценой какого оверхеда.
Какая может быть цена, если сам ничего руками не пишешь?
И согласен если не нужна типизация, то вероятно стоит подумать о том что бы встроить в программу что-то скриптовое например python или lua
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
01.09.2016, 11:16 17
Цитата Сообщение от Avazart Посмотреть сообщение
Какая может быть цена
За боксинг-анбоксинг и типоопределитинг. Например, делать структуру с указателем на void и полем char *typename - достаточно дорого, помимо выделения памяти и запаковки приходится строку читать и сравнивать.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2016, 11:25 18
Цитата Сообщение от _Ivana Посмотреть сообщение
делать структуру с указателем на void и полем char *typename - достаточно дорого
Вместо typename- typeid т.е. целое, а не строка.
И дорого в сравнении с чем? "Скрипты" под капотом ведь скорее всего поступают также.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
01.09.2016, 11:27 19
В сравнении с теми же приведенными instance of и is в Шарпе и Джаве. Там это не вручную скриптами под капотом и не либами поверх ядра, там это в самом ядре языка сделано и компилируется не в парсинг строкового имени типа.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2016, 11:29 20
Цитата Сообщение от _Ivana Посмотреть сообщение
там это в самом ядре языка сделано и компилируется не в парсинг строкового имени типа.
А ядро языка на чем пишется и как? обычно на Си и ровно так же...
0
01.09.2016, 11:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.09.2016, 11:29
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru