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

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

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

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

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

Привет.
Как можно грамотно с точки зрения ООП реализовать класс-контейнер, где будут хранится объекты?
Объекты не однотипные, а наследники.
Нужно будет грамотно манипулировать(получать, сортировать итд итп) объектами по наследованному типу.
Ваши идеи и примеры.
Благодарю
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6547 / 3967 / 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
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
Нарушитель
7036 / 5213 / 258
Регистрация: 10.12.2010
Сообщений: 22,882
Записей в блоге: 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++ Зачем нужно освобождать память динамических объектов в деструкторе, если всё равно это сделает менеджер памяти
Реализовать движущийся графический объект с помощью статических и динамических объектов C++
C++ Контейнер map

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

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

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