Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Списки как с ними работать
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
monday monday вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.01.2008
По умолчанию Списки как с ними работать - 17.03.2008, 19:52

Пишу на Borland C++ 2 класса списков: однонаправленного и двунаправленного. (шаблонные)
Пишу самостоятельно =)
Вот классы:

Код:
template<class Tdata>
class elem_sll  // класс элемента однонаправленного списка ( "simlpy linked list" )
{
public:
    Tdata data;                     //данные элемента
    elem_ssl<Tdata>* next;  // указатель на следующий элемент списка
};

template<class Tdata>   // класс однонаправленного списка ( "simlpy linked list" )
class ssl
{
protected:
    ....
    elem_ssl<Tdata>* head; // голова списка
    elem_ssl<Tdata>* curr;  // текущая позиция в списке
            ....
public:
    ...
    ssl(const ssl<Tdata> &a);   // конструктор копий
    ....
};

// теперь наследуем класс ssl для dsl - двунаправленного списка
template<class Tdata>
class elem_dsl : public elem_ssl<Tdata>  // класс элемента двунаправленного списка ( "double linked list" )
{
public:
    elem_dsl<Tdata>* prev;  // указатель на предыдущий элемент
};

template<class Tdata>
class dsl:public ssl<Tdata> // класс элемента двунаправленного списка ( "double linked list" )
{
{
    elem_dsl<Tdata>* tail;  // хвост списка
public:
    ...
    dsl(const dsl<Tdata> &a); // конструктор копий
    ...
};
проблема:
- для обьекта класса DSL вызывается 2 конструктора копии. Они выделяют новую память для элементов списка. Поскольку конструктор копи уже создал область для новой памяти хранения типа elem_ssl и копировал значения data и связав указатели... то конструктор копии в DSL должен привязать к ним указатель prev. пока я заново создаю еще пространство в памяти для типа elem_dsl. можно ли как то в С++ преобразовать уже созданные в памяти переменные в другой тип (не изменяя адреса при этом) чтобы добавить ним остальные части структуры. (prev). dynamic_cast может ли это сделать? в Borland C++ этого нет походу.

2ая проблекма не пойму(может я отупел уже =) ) в чем компилятор ругается на эту ошибку:
Код:
// у класса ssl перегружен оператор []
Tdata& operator[](int i);  // Tdata - тип по шаблону
....
// где нибудь, используем:
ssl< ssl<int> >* list1;  // список из списков целых значений
...
ssl<int> *p;
p=list1[2];   // ЗДЕСЬ ошибка- BORLAND ERROR: несоотвествие типов !!! и не может преобразовать из типа1 в тип2
//Error MAIN.CPP 31: Cannot convert 'ssl<ssl<int>>' to 'ssl<int>*  :shock: 
попробовал так
ssl<int> p;
p=list1[2];
//Error MAIN.CPP 31: Could not find a match for 'ssl<int>::ssl(ssl<ssl<int>>)
....
недогоняю
спасибо.
Ответить с цитированием
  (#2 (permalink)) Старый
Keetsune Keetsune вне форума
Member
 
Сообщений: 352
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.04.2006
По умолчанию 17.03.2008, 21:08

p=(ssl<int>*)&list1[2];
Ответить с цитированием
  (#3 (permalink)) Старый
D_K D_K вне форума
Member
 
Сообщений: 1,681
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 23.11.2005
По умолчанию 17.03.2008, 23:11

Не вижу смысла в хранении "текущего элемента" внутри контейнера.
Наследование здесь, на мой взгляд, совершенно не оправдано.
Зачем list1 объявлен как указатель?
В общем, код, ИМХО, требует переработки.


импортирован с progz.ru
Ответить с цитированием
  (#4 (permalink)) Старый
monday monday вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.01.2008
По умолчанию 17.03.2008, 23:24

Цитата:
Не вижу смысла в хранении "текущего элемента" внутри контейнера.
Наследование здесь, на мой взгляд, совершенно не оправдано.
Зачем list1 объявлен как указатель?
В общем, код, ИМХО, требует переработки.
ну list1 как указатель обьявлен т.к. я передаю ее в функции по параметру.


PS про наследование: ведь двунаправдленный список - это объект выполняет те же действия что и однонаправленный, кроме этого добавляется возможность обратного перемещения указателя текущего элемента в списке.

"текущий указатель" в контейнере - это не имеет смысла? как не имеет? как вы бы сделали чтобы иметь информацию о текущем положении в списе???
Ответить с цитированием
  (#5 (permalink)) Старый
Влад Влад вне форума
Профессионал
 
Сообщений: 3,882
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 18.03.2008, 14:23

Цитата:
Можно ли как то в С++ преобразовать уже созданные в памяти переменные в другой тип (не изменяя адреса при этом) чтобы добавить ним остальные части структуры (prev). dynamic_cast может ли это сделать?
Имей в виду, что dynamic_cast<> сработает только по иерархии наследования. Во всех других случаях тебе надо смотреть в сторону reinterpret_cast<>.

Цитата:
"текущий указатель" в контейнере - это не имеет смысла? как не имеет? как вы бы сделали чтобы иметь информацию о текущем положении в списе???
Гм. Сугубо имхо, конечно, но, по-моему, понятие "текущего указателя" в контейнере общего назначения, предназначенного для повторного применения (а иначе - зачем его делать шаблонным?), может создать немало головной боли как разработчику, так и пользователю (=другому разработчику). Вот примеры:
Пусть контейнер первоначально содержит элементы со значениями 0, 1, 2, 3, 4, 5. "Текущий указатель" указывает на элемент со значением 3.
1. Вставляем в контейнер между элементами 2 и 3 элемент 8, контейнер стал теперь: 0, 1, 2, 8, 3, 4, 5. Куда теперь должен указывать "текущий указатель"? Почему?
2. Удаляем из первоначального контейнера элемент 3, содержимое стало: 0, 1, 2, 4, 5. Куда теперь должен указывать "текущий указатель"? Почему?
3. Удаляем из первоначального контейнера элементы с 1 по 4, содержимое стало: 0, 5. Куда теперь должен указывать "текущий указатель"? Почему?
4. Заменяем часть содержимого контейнера: было 0, 1, 2, 3, 4, 5, стало 0, 22, 23, 24, 25, 26, 3, 27, 28, 4, 5. Куда теперь должен указывать "текущий указатель"? Почему?
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
monday monday вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.01.2008
По умолчанию 18.03.2008, 17:00

Цитата:
Гм. Сугубо имхо, конечно, но, по-моему, понятие "текущего указателя" в контейнере общего назначения, предназначенного для повторного применения (а иначе - зачем его делать шаблонным?), может создать немало головной боли как разработчику, так и пользователю (=другому разработчику). Вот примеры:
Пусть контейнер первоначально содержит элементы со значениями 0, 1, 2, 3, 4, 5. "Текущий указатель" указывает на элемент со значением 3.
1. Вставляем в контейнер между элементами 2 и 3 элемент 8, контейнер стал теперь: 0, 1, 2, 8, 3, 4, 5. Куда теперь должен указывать "текущий указатель"? Почему?
2. Удаляем из первоначального контейнера элемент 3, содержимое стало: 0, 1, 2, 4, 5. Куда теперь должен указывать "текущий указатель"? Почему?
3. Удаляем из первоначального контейнера элементы с 1 по 4, содержимое стало: 0, 5. Куда теперь должен указывать "текущий указатель"? Почему?
4. Заменяем часть содержимого контейнера: было 0, 1, 2, 3, 4, 5, стало 0, 22, 23, 24, 25, 26, 3, 27, 28, 4, 5. Куда теперь должен указывать "текущий указатель"? Почему?
Ах! Вы об этом! =)
Ну конечно если договориться об этом, то я сделал таким образом.
1.Вставку я осуществляю всегда после текущего элемента. (недостаток: нельзя вставить в начало, т.е. перед 1ым элементом). После этого указатель становится тем же как и раньше.
2. Удаление: после удаления указателем на тек. элем. ставновится следущий элемент, если был удаляемый элемент был последним - то прредыдущий. =)
3.4. ну таких операций еще не предусмотрено.

Если мыслить рационально и глубоко, то я пожалуй и думаю, что это лишнее..

Как я уже сказал reinterpret_cast<> отсуствует в борладне. Или я неправ?
Ответить с цитированием
  (#7 (permalink)) Старый
Влад Влад вне форума
Профессионал
 
Сообщений: 3,882
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 18.03.2008, 23:16

Цитата:
1.Вставку я осуществляю всегда после текущего элемента. [.....]
2. Удаление: после удаления указателем на тек. элем. ставновится следущий элемент, если был удаляемый элемент был последним - то прредыдущий.
И следствия (они же - недостатки):
1. Невозможно вставить элемент в произвольную позицию. Следствие: невозможно отсортировать содержимое контейнера по какому-либо признаку (т.е. получить "сортированный список").
2. А что делать, если удаляемый элемент - единственный? Т.е, если после удаления контейнер будет пуст? Куда будет указывать "текущий указатель"?

Цитата:
Как я уже сказал reinterpret_cast<> отсуствует в борладне. Или я неправ?
Не прав. Если, конечно, этот "Борланд" не времен царя Гороха.... Стандарт языка был принят в 1998 году - десять лет назад.
Ответить с цитированием
  (#8 (permalink)) Старый
monday monday вне форума
Member
 
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.01.2008
По умолчанию 19.03.2008, 03:30

Цитата:
2. А что делать, если удаляемый элемент - единственный? Т.е, если после удаления контейнер будет пуст? Куда будет указывать "текущий указатель"?
будет равен 0. как и head.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Модули как с ними работать Jean-Esther Haskell 3 01.05.2011 06:17
Многоуровневые списки как с ними работать imported_Юленька Lisp 12 30.11.2009 11:13
Структуры в Си как с ними работать misha-_- С/С++ 3 02.05.2009 14:11
Связные списки как с ними работать Areostar Visual Basic 0 07.06.2008 10:13
С++ списки как с ними работать imported_madjihad С/С++ 6 21.05.2008 16:58
С# и Oracle как с ними работать Cantona .NET 1 16.10.2007 21:17
Списки как с ними работать gleban С/С++ 9 09.06.2006 18:17
API - Функции как с ними работать Serega_Mexanik Вопросы начинающих программистов 5 23.03.2006 01:02
C++ и SCO как с ними работать c++ Мысли вслух 6 28.01.2006 07:50
Unicode как с ними работать Exhu Delphi 4 22.03.2005 01:53
Двусвязные списки и операции над ними Anonymous Pascal 1 22.01.2004 20:24
IIS и ASP как с ними работать Anonymous ASP 2 04.04.2003 18:24



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов