| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Создать список из классов |
| Автор: haword 21.10.2004, 07:41 |
| Такая задача встала, может кто сталкивался с такой. Надо создать список содержащий различные классы, никак не могу придумать как это сделать class Pervyi { public: string name; string type; } class Vtoroi { public: string name; string type; } List.AddClass(Pervyi); List.AddClass(Vtoroi); как вот этот лист реализовать? Есть может какие стандартные функции для этого? |
| Автор: mr.DUDA 21.10.2004, 07:53 | ||
Добавляй в список указатели на объекты, а не сами объекты:
А перед тем, как начинать изобретать свой велосипед... простите, список -- я бы посоветовал заглянуть в С++ FAQ, тема "Об STL простыми словами - Динамические массивы, списки и т.п.". |
| Автор: haword 21.10.2004, 12:56 |
| втот то весь и прикол что при STL пишется примерно так: class a {}; class b{}; vector<a> list или vector<b> list а надо и а класс и b класс в один список добавлять, в том и проблема |
| Автор: maxim1000 21.10.2004, 13:10 |
| тут несколько другой вопрос: создать список именно классов здесь можно попробовать такой подход: 1. все классы должны наследоваться от одного 2. создается список не классов, а "фабрик" под фабрикой класса здесь понимается функция, которая создает объект с параметрами по умолчанию |
| Автор: Mad 21.10.2004, 13:19 |
| haword Если ты просто накидаеш разные классы в обин список, то как ты потом их разбирать будеш А если у класов есть чтото общее (например родительский класс) то просто делаеш список из родителей |
| Автор: chipset 21.10.2004, 13:23 | ||||
Можно реализовать на коленке RTTI, то есть встроить в базовый класс object имя типа..
Базовый object.. |
| Автор: maxim1000 21.10.2004, 13:25 |
| вообще, лучше бы чуть полнее описать задачу на уровень выше (т.е. зачем понадобился список классов), тогда помощь может оказаться более эффективной... |
| Автор: haword 22.10.2004, 08:12 | ||
Спасибо за ответы! Сделал так
выводит только b.Proba, b.a не сохраняется, забываются значения класса Child |
| Автор: bel_nikita 22.10.2004, 10:51 |
| не, не очень. лучше хранить поинтеры на объекты, а не сами объекты. потом проблеммы с конструктором копий начнуться |
| Автор: haword 22.10.2004, 11:50 | ||
как? |
| Автор: bel_nikita 22.10.2004, 12:21 | ||||
Вроде так |
| Автор: haword 22.10.2004, 14:10 |
| а если я потом классы а и b удаляю то в списке указатель этот класс тоже ведь летит так? а мне хранить их надо |
| Автор: bel_nikita 22.10.2004, 15:22 | ||
| hawordага. Если удаляешь объекты, то удаляй и поитеры на них из списка. Ворочать укзателями намного эффективнее, нежели целыми объектами.
я тож поддерживаю эту идею |
| Автор: Guest 23.10.2004, 20:50 |
| Огромное спасибо за советы! Моя задача была такова! 1. Есть класс - папа. 2. У него есть некий набор виртуальных ф-ций (допустим, GetType) 3. Есть у него дети, каждый из которых как накрывает виртуальный ф-ции (например, реализует свой GetType), так и имеет свои Задача - нужен класс - контейнер (типа std::Array), чтобы в него можно было запихивать любого из детей. Я скланяюсь к использованию boost::any типа std::vector< boost::any<Roditel> > v, думаю это наиболее правильное решение или нет? Хотя в принципе не хотелось бы лишнюю либу (тот же boost), если можно обойтись своими силами и STL |
| Автор: Mad 24.10.2004, 13:33 | ||
Не знаю что тут лучше std::vector или std::list, зависит от того, что ты дальше с этим списком делать будеш.
непонятно зачем тебе тут boost::any<Roditel> std::vector<Roditel> нормально работает |
| Автор: haword 25.10.2004, 17:50 |
| потому что при передаче дочернего класса у меня пропадают параметры дочернего класса остаются только параметры родительского класса |
| Автор: Mad 25.10.2004, 18:07 |
| haword Да никуда они не пропадают. Если ты храниш сами обьекты то ((Child*)(&array[x]) дает тебе указатель на Child со всеми его свойствами |
| Автор: haword 25.10.2004, 18:16 |
| Mad Плизз! как мне сделать это в контексте моего класса напищи пожалуста! Я несильно хорошо в си++ разбираюсь! |
| Автор: Mad 25.10.2004, 18:23 | ||
haword
|
| Автор: bel_nikita 25.10.2004, 21:34 | ||||||||
| Mad Я конечно извиняюсь, но то, что ты написал в последнем примере полное не то
Про точкую с запятой и virtual в деструкторе уже не буду упоминать З.Ы.: только без обид З.Ы.2: если будет время черкану простенький пример контейнер Добавил: простенький примитив поясняющий что да как ( времени особо нет пояснить толково, завтра постараюсь )
А! Еще не забудь virtual ~ Parent() ставить |