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

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

Восстановить пароль Регистрация
 
vendeme
 Аватар для vendeme
-32 / 3 / 3
Регистрация: 22.06.2011
Сообщений: 88
01.09.2012, 22:35     Контейнер и получение динамических объектов #1
Привет.
Как можно грамотно с точки зрения ООП реализовать класс-контейнер, где будут хранится объекты?
Объекты не однотипные, а наследники.
Нужно будет грамотно манипулировать(получать, сортировать итд итп) объектами по наследованному типу.
Ваши идеи и примеры.
Благодарю
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.09.2012, 22:47     Контейнер и получение динамических объектов #2
контейнер с указателями на базовый класс
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 23:31     Контейнер и получение динамических объектов #3
Бинго.
А вообще - разве так много вариантов? Вопрос уже содержит ответ сам по себе.
vendeme
 Аватар для 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();
}
получается очень грубо.
Нужен более масштабный, шаблонный и красивый вариант.

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

З.Ы. dynamic_cast кинет экзепшн если там не Cat*
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.09.2012, 23:45     Контейнер и получение динамических объектов #6
vendeme, Виртуальный интерфейс и все будет работать красиво.

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

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

Как перебрать сразу только Cat*, а не весь список. Ну или иные идеи.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.09.2012, 23:58     Контейнер и получение динамических объектов #8
vendeme, А зачем перебирать только Cat*? Только Cat* исключительно dynamic_cast_ом. Что есть виртуальный интерфейс? Некий базовый абстрактный класс с виртуальными (чисто-виртуальными) функциями, которые переопределяются в производных классах, извне работаем через виртуальный интерфейс. Ну или NVI http://insidecpp.ru/patterns/nonvirtual_interface/
vendeme
 Аватар для 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 список лучше использовать для хранение указателей на объектов?
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
02.09.2012, 00:25     Контейнер и получение динамических объектов #10
Цитата Сообщение от vendeme Посмотреть сообщение
Какой STL список лучше использовать для хранение указателей на объектов?
Зависит от того какие действия тебе от него нужны. Частая вставка/удаление, только в конец или нет, частый ли поиск, непрерывность итд
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,606
Записей в блоге: 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();
    }  
}
vendeme
 Аватар для 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.
Я уже говорил грубый что вариант
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.09.2012, 03:55     Контейнер и получение динамических объектов
Еще ссылки по теме:

Нехватка памяти при создании динамических объектов C++
C++ Динамический массив динамических объектов
C++ Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,606
Записей в блоге: 17
02.09.2012, 03:55     Контейнер и получение динамических объектов #13
Цитата Сообщение от vendeme Посмотреть сообщение
тему не читал
По огрызкам кода не понятно что такое GetGUID() ...
Yandex
Объявления
02.09.2012, 03:55     Контейнер и получение динамических объектов
Ответ Создать тему
Опции темы

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