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

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

Войти
Регистрация
Восстановить пароль
 
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
#1

Контейнер и получение динамических объектов - C++

01.09.2012, 22:35. Просмотров 731. Ответов 12
Метки нет (Все метки)

Привет.
Как можно грамотно с точки зрения ООП реализовать класс-контейнер, где будут хранится объекты?
Объекты не однотипные, а наследники.
Нужно будет грамотно манипулировать(получать, сортировать итд итп) объектами по наследованному типу.
Ваши идеи и примеры.
Благодарю
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 22:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Контейнер и получение динамических объектов (C++):

Удаление динамических объектов - C++
есть программа, в которой реализован список объектов, создающиеся динамически. Перед вами функция, которая получает указатель на один из...

Контейнер list из указателей объектов - C++
Есть абстрактный класс и производный от него.В производном переопределяется вирт ф-ия draw(). Добавляю в контейнер указатель на объект,...

Динамический массив динамических объектов - C++
Физически задача поставлена так: есть узел который состоит из разных деталей, количество деталей в узле может быть разным; из узлов...

STL вектор динамических объектов - C++
Нужно время от времени ложить в std::vector (или std::list) динамические объекты. Под динамическим объектом здесь понимается объект,...

Понятие принципа создания динамических объектов - C++
Например я написал такой код: #include <iostream> #include <string> using namespace std; class Box { ...

запись и чтение динамических объектов в файл - C++
Как быть, че делать? Особенно при чтение файла, ведь неизвестно какого он размера. И как бы все это разместить в одной функции, ну например...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.09.2012, 22:47 #2
контейнер с указателями на базовый класс
1
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 23:31 #3
Бинго.
А вообще - разве так много вариантов? Вопрос уже содержит ответ сам по себе.
0
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
01.09.2012, 23:32  [ТС] #4
Ну это то понятно.
А какой тип списка лучше использовать в качестве хранение объектов?
Как методами шаблонов реализовать функций для манипулирование объектами?
допустим я хочу перебрать всех Cat из базового Animal
C++
1
2
3
4
5
for(AnimalContainer::iterator it = animals.begin(); it != animals.end();++it)
{
    if((*it) == dynamic_cast<Cat*>(*it))
        it->Birth();
}
получается очень грубо.
Нужен более масштабный, шаблонный и красивый вариант.

Примеры в студию пожалуйста
0
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 23:43 #5
Можно попробовать через typeid.

З.Ы. dynamic_cast кинет экзепшн если там не Cat*
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.09.2012, 23:45 #6
vendeme, Виртуальный интерфейс и все будет работать красиво.

Добавлено через 32 секунды
PSIAlt, dynamic_cast не кидает исключений, при работе с указателями.
0
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
01.09.2012, 23:52  [ТС] #7
Цитата Сообщение от PSIAlt Посмотреть сообщение
Можно попробовать через typeid.
Грубый вариант

Цитата Сообщение от ForEveR Посмотреть сообщение
vendeme, Виртуальный интерфейс и все будет работать красиво.
в смысле?

Как перебрать сразу только Cat*, а не весь список. Ну или иные идеи.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.09.2012, 23:58 #8
vendeme, А зачем перебирать только Cat*? Только Cat* исключительно dynamic_cast_ом. Что есть виртуальный интерфейс? Некий базовый абстрактный класс с виртуальными (чисто-виртуальными) функциями, которые переопределяются в производных классах, извне работаем через виртуальный интерфейс. Ну или NVI http://insidecpp.ru/patterns/nonvirtual_interface/
0
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
02.09.2012, 00:21  [ТС] #9
А, абстрактный клас, так бы сразу сказали, ясно.

Вот в одном проекте как идёт проверка объектов шаблоном
C++
1
2
    if(Cat* pCat = HashMap<Cat>::Find(CatGUID()))
        pCat->Birth();
Добавлено через 2 минуты
ну или
C++
1
2
3
for(it = deadAnimals.begin(); it != deadAnimals.end();++it)
    if(Cat* pCat = HashMap<Cat>::Find(*it->GetGUID())
        pCat->Birth();
Добавлено через 3 минуты
Как построить такой класс-синглтон(ну или статический)?
Какой STL список лучше использовать для хранение указателей на объектов?
0
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
02.09.2012, 00:25 #10
Цитата Сообщение от vendeme Посмотреть сообщение
Какой STL список лучше использовать для хранение указателей на объектов?
Зависит от того какие действия тебе от него нужны. Частая вставка/удаление, только в конец или нет, частый ли поиск, непрерывность итд
1
Avazart
Эксперт С++
7190 / 5364 / 280
Регистрация: 10.12.2010
Сообщений: 23,669
Записей в блоге: 17
02.09.2012, 01:26 #11
C++
1
2
3
4
5
6
7
8
9
for(AnimalContainer::iterator it = animals.begin(); it != animals.end();++it)
{ 
   Cat* murzik= NULL;
   murzik= dynamic_cast<Cat*>(*it) ;
   if (murzik != NULL )  
    {
      murzik ->Birth();
    }  
}
Добавлено через 4 минуты
Есть еще вариант в базовом классе создать нечто вроде поля "имя" и проверять его

C++
1
2
3
4
5
6
7
for(AnimalContainer::iterator it = animals.begin(); it != animals.end();++it)
{ 
   if (  (*it)->name == "cat" )  
    {
       (*it)->Birth();
    }  
}
0
vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
02.09.2012, 03:50  [ТС] #12
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
for(AnimalContainer::iterator it = animals.begin(); it != animals.end();++it)
{ 
   Cat* murzik= NULL;
   murzik= dynamic_cast<Cat*>(*it) ;
   if (murzik != NULL )  
    {
      murzik ->Birth();
    }  
}
Добавлено через 4 минуты
Есть еще вариант в базовом классе создать нечто вроде поля "имя" и проверять его

C++
1
2
3
4
5
6
7
for(AnimalContainer::iterator it = animals.begin(); it != animals.end();++it)
{ 
   if (  (*it)->name == "cat" )  
    {
       (*it)->Birth();
    }  
}
тему не читал, пост запостил?
Если сравнивать по типу, то уж лучше тип объявить как enum.
Я уже говорил грубый что вариант
0
Avazart
Эксперт С++
7190 / 5364 / 280
Регистрация: 10.12.2010
Сообщений: 23,669
Записей в блоге: 17
02.09.2012, 03:55 #13
Цитата Сообщение от vendeme Посмотреть сообщение
тему не читал
По огрызкам кода не понятно что такое GetGUID() ...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2012, 03:55
Привет! Вот еще темы с ответами:

Нехватка памяти при создании динамических объектов - C++
Создаю 4 динамических объекта. 3 вектора и матрица. матрица - это результат перемножения двух векторов. третий вектор- это суммы...

Реализовать движущийся графический объект с помощью статических и динамических объектов - C++
Добрый день. Решаю задачу из методички и поставлена она следующим образом: используя технологию объектно-ориентированного...

Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти - C++
Не скажу за все ОС-и, но под Windows есть менеджер памяти. Когда по ходу кода встречается new, ну или что - то другое для алокации...

В программе реализовать возможность записи объектов в файл и чтения объектов из файла - C++
Добрый день, помогите, пожалуйста! У меня есть программа: #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; class...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.09.2012, 03:55
Ответ Создать тему
Опции темы

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