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

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

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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
01.09.2012, 22:47     Контейнер и получение динамических объектов #2
контейнер с указателями на базовый класс
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 23:31     Контейнер и получение динамических объектов #3
Бинго.
А вообще - разве так много вариантов? Вопрос уже содержит ответ сам по себе.
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
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
01.09.2012, 23:43     Контейнер и получение динамических объектов #5
Можно попробовать через typeid.

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

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

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

Как перебрать сразу только Cat*, а не весь список. Ну или иные идеи.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.09.2012, 23:58     Контейнер и получение динамических объектов #8
vendeme, А зачем перебирать только Cat*? Только Cat* исключительно dynamic_cast_ом. Что есть виртуальный интерфейс? Некий базовый абстрактный класс с виртуальными (чисто-виртуальными) функциями, которые переопределяются в производных классах, извне работаем через виртуальный интерфейс. Ну или NVI http://insidecpp.ru/patterns/nonvirtual_interface/
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
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
02.09.2012, 00:25     Контейнер и получение динамических объектов #10
Цитата Сообщение от vendeme Посмотреть сообщение
Какой STL список лучше использовать для хранение указателей на объектов?
Зависит от того какие действия тебе от него нужны. Частая вставка/удаление, только в конец или нет, частый ли поиск, непрерывность итд
Avazart
Эксперт С++
7121 / 5298 / 273
Регистрация: 10.12.2010
Сообщений: 23,436
Записей в блоге: 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
-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++
Создать контейнер, в который можно добавлять и удалять методы. Размер контейнера должен увеличиваться автоматически. Вот такое задание ,...

Контейнер stack - C++
есть функция, которая возвращает контейнер stack(точнее ссылку на его верхний элемент return binary.top();). как можно достать все...

Контейнер list - C++
Добрый день! Помогите пожалуйста разобраться, никогда раньше не работал с листом. Задача следующая: В числовой последовательности...

Подскажите контейнер - C++
Нужно: Делать вставку по ключу, полный обход, удаление по ключу. Дубли не разрешены, сортировка не важна. Ключ std::pair&lt;int,int&gt;. ...


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

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

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