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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация списков с разными данными, Организация списков с разными данными 
:(
    Опции темы
Merlin_ua
Дата 26.4.2012, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день!
Есть задача: создать связный список, данные которые будет содержать узел списка могут быть разные. В основном это различного рода структуры и классы. Я сделал следующим образом (пример сильно упрощен):

Код

//класс узла
class Node
{
public:
    Node();
    ~Node();
    char Name[64];
    Node* NextNode;
    Node* PrevNode;
    void* Data;
};

//класс списка
class List
{
public:
    List();
    ~List();
    Node* FirstNode;                            //первый узел списка
    Node* LastNode;                            //последний узел списка
    Node* Insert(unsigned int nNode);//вставляет узел сразу за nNode и возвращает его указатель
                                                               //указатель
    Node* Find(unsigned int nNode);   //возвращает указатель узла nNode
    void Del(unsigned int nNode);        //удаляет узел nNode
    unsigned int nNodes;                     //колличество узлов в списке
};

////////////////////////////////////////////////////////////////////////////////////
//реализация узла

Node::Node()
{
    NextNode = 0; PrevNode = 0; Data = 0;
}

Node::~Node()
{
    if(Data!=0) delete Data;
}

//реализация списка
//здесь привожу только конструктор и деструктор, так как остальное не имеет интереса по данному //вопросу

List::List()
{
    FirstNode = 0; LastNode = 0; nNodes = 0;
}
List::~List()
{
    while (FirstNode > 0) Del(); //Del() удаляет последний узел списка
    
}


Ну и по существу. В программе могут существовать различные списки, узлы которых содержат различного рода данные. Данные в узлах однородны в пределах списка. Т.е. в одном списке одни данные, в другом - другие. Различных данных в одном списке пока что нет, но не уверен, что такой ситуации не возникнет. Манипуляции со списками во всех случаях одинаковы. Поэтому я сделал один класс для управления списком, а данные в узле - это указатель на неопределенный тип: void* Data;
Работать оно то работает, только постоянно приходится приводить void* Data; к нужным типам через static cast. Читал, что такие действия не очень приветствуются. Вопрос: насколько правильно мое решение. возможно ли решить данную задачу как-то красивее?

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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Merlin_ua, да. эта задача решается красиво через шаблоны (template). Почитай о них.
PM   Вверх
Merlin_ua
Дата 26.4.2012, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Можно через шаблоны. Но с таким же успехом я бы мог сделать для каждого типа свой узел, меняться будет лишь тип данных, т.е. тип Data. Тогда для каждого такого узла нужен свой класс списка, в котором будет меняться лишь тип узла. Т.е. Мы получим кучу повторяющегося кода, который будет отличаться кое-где двумя строками. Шаблоны сделают тоже самое. только выглядеть это будет посимпатичнее. А если данные в одном списке различны?
PM MAIL   Вверх
bsa
Дата 27.4.2012, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Merlin_ua, преждевременная оптимизация - враг хорошего кода.
PM   Вверх
mes
Дата 27.4.2012, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(Merlin_ua @  26.4.2012,  09:40 Найти цитируемый пост)
А если данные в одном списке различны? 

смотрите концепцию (boost:: ) any..  где то на форуме были приведены пару разборов ее реализации.. поиск по any и type erasure должен помочь.. 



Это сообщение отредактировал(а) mes - 27.4.2012, 17:43


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


Новичок



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

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



Цитата

смотрите концепцию (boost:: ) any..  где то на форуме были приведены пару разборов ее реализации.. поиск по any и type erasure должен помочь.. 

А можно без сторонних библиотек? Меня больше интересуют принципы и усройства механизмов чем готовые решения.
PM MAIL   Вверх
bsa
Дата 1.5.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Merlin_ua, тебе сказали "смотри концепцию" или "используй"?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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