Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создать список из классов 
:(
    Опции темы
haword
Дата 21.10.2004, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 21.10.2004

Репутация: нет
Всего: 3



Такая задача встала, может кто сталкивался с такой. Надо создать список содержащий различные классы, никак не могу придумать как это сделать :( Что то навроде этого:

class Pervyi
{
public:
string name;
string type;
}

class Vtoroi
{
public:
string name;
string type;
}

List.AddClass(Pervyi);
List.AddClass(Vtoroi);

как вот этот лист реализовать? Есть может какие стандартные функции для этого?


PM MAIL   Вверх
mr.DUDA
Дата 21.10.2004, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Добавляй в список указатели на объекты, а не сами объекты:
Код
class A {};
class B {};


class List
{
 void Add(void *object)
 {
      // ...
 }
}


А перед тем, как начинать изобретать свой велосипед... простите, список -- я бы посоветовал заглянуть в С++ FAQ, тема "Об STL простыми словами - Динамические массивы, списки и т.п.".


--------------------
user posted image
PM MAIL WWW   Вверх
haword
Дата 21.10.2004, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 21.10.2004

Репутация: нет
Всего: 3



втот то весь и прикол что при STL пишется примерно так:
class a {};
class b{};

vector<a> list
или
vector<b> list

а надо и а класс и b класс в один список добавлять, в том и проблема
PM MAIL   Вверх
maxim1000
Дата 21.10.2004, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



тут несколько другой вопрос: создать список именно классов
здесь можно попробовать такой подход:
1. все классы должны наследоваться от одного
2. создается список не классов, а "фабрик"
под фабрикой класса здесь понимается функция, которая создает объект с параметрами по умолчанию


--------------------
qqq
PM WWW   Вверх
Mad
Дата 21.10.2004, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



haword
Если ты просто накидаеш разные классы в обин список, то как ты потом их разбирать будеш :)
А если у класов есть чтото общее (например родительский класс) то просто делаеш список из родителей :)


--------------------
user posted image
PM MAIL   Вверх
chipset
Дата 21.10.2004, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Цитата(Mad @ 21.10.2004, 03:19)
Если ты просто накидаеш разные классы в обин список, то как ты потом их разбирать будеш

Можно реализовать на коленке RTTI, то есть встроить в базовый класс object имя типа..
Цитата(Mad @ 21.10.2004, 03:19)
А если у класов есть чтото общее (например родительский класс) то просто делаеш список из родителей 

Базовый object..


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
maxim1000
Дата 21.10.2004, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



вообще, лучше бы чуть полнее описать задачу на уровень выше (т.е. зачем понадобился список классов), тогда помощь может оказаться более эффективной...


--------------------
qqq
PM WWW   Вверх
haword
Дата 22.10.2004, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 21.10.2004

Репутация: нет
Всего: 3



Спасибо за ответы! Сделал так
Код

class Roditel
{
public:
string Proba;
};

class Child: public Roditel
{
public:
 string a;
};


typedef Roditel sz;

class ValueList
{
 vector<sz , allocator<sz> > lz;
public:
 ValueList()
 {
  lz.clear();
 }
 void AddValue(sz& Znach)
 {
   lz.insert(lz.begin(),Znach);
 };
 void GetValue(sz& Znach)
  {
   Znach = lz.at(0);
  };
};

int main(void)
{
Child a;
Child b;
ValueList vl;
a.a="ssss";
a.Proba="aaa";
vl.AddValue(a);
vl.GetValue(b);
cout << b.a << b.Proba << endl;
return 0;
};

выводит только b.Proba, b.a не сохраняется, забываются значения класса Child :( Выводятся значения только родительского класса :( Я в этом деле новичек, может что то напутал? Как мне сделать чтоб получить значения дочернего класса?

Это сообщение отредактировал(а) haword - 22.10.2004, 09:10
PM MAIL   Вверх
bel_nikita
Дата 22.10.2004, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



не, не очень. лучше хранить поинтеры на объекты, а не сами объекты. потом проблеммы с конструктором копий начнуться


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
haword
Дата 22.10.2004, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 21.10.2004

Репутация: нет
Всего: 3



Цитата(bel_nikita @ 22.10.2004, 10:51)
не, не очень. лучше хранить поинтеры на объекты, а не сами объекты. потом проблеммы с конструктором копий начнуться

как?
PM MAIL   Вверх
bel_nikita
Дата 22.10.2004, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Код
typedef Roditel* sz;


Код
vl.AddValue(&a);
vl.GetValue(&b);


Вроде так :)


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
haword
Дата 22.10.2004, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 21.10.2004

Репутация: нет
Всего: 3



а если я потом классы а и b удаляю то в списке указатель этот класс тоже ведь летит так? а мне хранить их надо

Это сообщение отредактировал(а) haword - 22.10.2004, 14:10
PM MAIL   Вверх
bel_nikita
Дата 22.10.2004, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



hawordага.
Если удаляешь объекты, то удаляй и поитеры на них из списка.
Ворочать укзателями намного эффективнее, нежели целыми объектами.

Цитата
вообще, лучше бы чуть полнее описать задачу на уровень выше (т.е. зачем понадобился список классов), тогда помощь может оказаться более эффективной...

я тож поддерживаю эту идею


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Guest
Дата 23.10.2004, 20:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Огромное спасибо за советы! Моя задача была такова!
1. Есть класс - папа.
2. У него есть некий набор виртуальных ф-ций (допустим, GetType)
3. Есть у него дети, каждый из которых как накрывает виртуальный ф-ции (например, реализует свой GetType), так и имеет свои

Задача - нужен класс - контейнер (типа std::Array), чтобы в него можно было запихивать любого из детей.

Я скланяюсь к использованию boost::any типа
std::vector< boost::any<Roditel> > v, думаю это наиболее правильное решение или нет? Хотя в принципе не хотелось бы лишнюю либу (тот же boost), если можно обойтись своими силами и STL
  Вверх
Mad
Дата 24.10.2004, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 7
Всего: 19



Не знаю что тут лучше std::vector или std::list, зависит от того, что ты дальше с этим списком делать будеш.
Цитата(Guest @ 23.10.2004, 20:50)
std::vector< boost::any<Roditel> > v,

непонятно зачем тебе тут boost::any<Roditel>
std::vector<Roditel> нормально работает :)


--------------------
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0783 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.