Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Список в С++: где ошибка?

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Список в С++: где ошибка?
Имя
Сообщение << Старые топики   Новые топики >>
Список в С++: где ошибка? - 2008-12-21 13:13:48.380000   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
Написал программу с помощью классов, которая составляет структуру списка. Всё вроде должно работать, но в одной функции выкидывает ошибку. Вот код:

#include &lt;assert.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; class Item { &nbsp;friend class List; &nbsp; &nbsp;private: &nbsp;Item(double value, Item *item=0) {val=value; next=item; }; &nbsp;double val; &nbsp;Item *next; }; class List { &nbsp;public: &nbsp;List(double a=0); &nbsp;List(double *, int); &nbsp;List(List&amp;); &nbsp;void out(char *); ~List() { remove(); }; &nbsp;int length() {return im; }; &nbsp;void remove(); &nbsp;void remove(int); &nbsp;void append(double); &nbsp;void append(double *, int); &nbsp;void add(List,double); &nbsp;void addvalues(List, double *, int); &nbsp;void cut(int); &nbsp;double &amp;operator [](int); &nbsp;private: &nbsp;Item *findEnd(); &nbsp;Item *first; &nbsp;int im; }; List::List(double a) { &nbsp;Item *curr=new Item(a); &nbsp;assert(curr!=0); &nbsp;first=curr; &nbsp;im=1; } List::List(double *mas, int num) { &nbsp;int i; Item *prev,*curr; &nbsp;curr=new Item(mas[0]); &nbsp;assert(curr!=0); &nbsp;prev=first=curr; &nbsp;for(i=1; i&lt;num; i++) &nbsp;{ &nbsp; curr = new Item(mas[i]); &nbsp; assert(curr!=0); &nbsp; prev-&gt;next=curr; &nbsp; prev=curr; &nbsp;} &nbsp;im=num; } List::List(List &amp;lem) { &nbsp;int i; Item *curr,*prev,*pt; &nbsp;pt=lem.first; &nbsp; &nbsp;curr = new Item(pt-&gt; val); &nbsp;assert(curr!=0); &nbsp;prev=first=curr; &nbsp; &nbsp;for(i=1; i&lt;lem.im; i++) &nbsp;{ &nbsp; pt=pt-&gt;next; &nbsp; curr=new Item(pt-&gt;val); &nbsp; assert(curr!=0); &nbsp; prev-&gt;next=curr; &nbsp; prev=curr; &nbsp;} &nbsp;im=lem.im; } void List::remove() { &nbsp;Item *pt=first; &nbsp;while(pt) &nbsp;{ &nbsp; Item *pnt=pt; &nbsp; pt=pt-&gt;next; &nbsp; delete pnt; &nbsp;} &nbsp;im=0; } Item *findEnd() { &nbsp;Item *curr; &nbsp;curr=first; &nbsp; &nbsp;while(curr-&gt;next); &nbsp; curr=curr-&gt;next; &nbsp;return curr; } void List::remove(int num) { &nbsp;assert(num&lt;im); &nbsp;int i=0; &nbsp;Item *prev,*curr; &nbsp;im-=num; &nbsp;prev=curr=first; &nbsp;while (i&lt;im) &nbsp;{ &nbsp; prev=curr; &nbsp; curr=curr-&gt;next; &nbsp; i++; &nbsp;} &nbsp; &nbsp;while(curr) &nbsp;{ &nbsp; Item *pnt=curr; &nbsp; curr=curr-&gt;next; &nbsp; delete pnt; &nbsp;} &nbsp;prev-&gt;next=0; } void List::out(char *name) { &nbsp;printf("%s&nbsp; im=%d\n",name,im); &nbsp; &nbsp;Item *curr; int num=0; curr=first; &nbsp; &nbsp;while (curr) &nbsp;{ &nbsp;&nbsp;&nbsp; printf("%3.f ",curr-&gt;val); &nbsp; curr=curr-&gt;next; &nbsp; num++; &nbsp; &nbsp; if ((num%5)==0) &nbsp;&nbsp; printf("\n"); &nbsp;} &nbsp;&nbsp;&nbsp; printf("\n"); } &nbsp; void List::append(double value) { &nbsp;Item *curr; &nbsp;Item *pt=new Item(value); &nbsp;assert(pt!=0); &nbsp;curr=findEnd(); &nbsp;curr-&gt;next=pt; &nbsp;im++; } void List::append(double *mas, int num) { &nbsp;if (num&lt;=0) {return; } &nbsp;int i; Item *curr,*prev; &nbsp;prev=findEnd(); &nbsp; &nbsp;for(i=0; i&lt;num; i++) &nbsp;{ &nbsp; curr=new Item(mas[i]); &nbsp; assert(curr!=0); &nbsp; prev-&gt;next=curr; &nbsp; prev=curr; &nbsp;} &nbsp;im+=num; } double &amp;List::operator [](int num) { &nbsp;Item *curr, *prev; &nbsp;int i,ifin; &nbsp;assert(num&gt;=0); &nbsp; &nbsp;if (num&lt;im) &nbsp;{ &nbsp; prev=first; &nbsp; &nbsp; while(num&gt;0) &nbsp; { &nbsp;&nbsp; prev=prev-&gt;next; &nbsp;&nbsp; num--; &nbsp; } &nbsp;} &nbsp;else &nbsp;{ &nbsp; prev=findEnd(); &nbsp; ifin=num-im+1; &nbsp;&nbsp; &nbsp; for(i=0; i&lt;ifin; i++) &nbsp; { &nbsp;&nbsp; curr=new Item(0.0); &nbsp;&nbsp; assert(curr!=0); &nbsp;&nbsp; prev-&gt;next=curr; &nbsp;&nbsp; prev=curr; &nbsp; } &nbsp; im=num+1; &nbsp;} &nbsp;return prev-&gt;val; } void List::add(List a,double value) { &nbsp;Item *curr; &nbsp;Item *pt=new Item(value); &nbsp;a.first=curr; &nbsp;pt-&gt;next=curr; &nbsp;a.first=pt; &nbsp;a.im++; } void List::addvalues(List a, double *mas, int n) { &nbsp;int i; &nbsp;for (i=0; i&lt;n; i++) &nbsp;{ &nbsp; a.add(a,mas[i]); &nbsp;} } void List::cut(int num) { &nbsp;assert(num&lt;im); &nbsp;Item *curr; &nbsp; &nbsp;for(int i=0; i&lt;num; i++) &nbsp;{ &nbsp; curr=first; &nbsp; curr=curr-&gt;next; &nbsp; delete first; &nbsp; first=curr; &nbsp; im--; &nbsp;} } &nbsp; main() { &nbsp;double a[]={1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}; &nbsp;double b[]={11.0, 12.0, 13.0, 14.0, 15.0}; &nbsp; &nbsp;List list1(a, 8); &nbsp;list1.out("list1"); &nbsp;list1.remove(3); &nbsp;list1.out("list1 after truncation"); &nbsp;list1.append(b, 3); &nbsp;list1.out("list1 after append(b,3)"); &nbsp;getch(); &nbsp;return 0; }
Текст ошибки такой:

quote:


Error 24task.CPP 107: Undefined symbol 'first'
Error 24task.CPP 109: 'Item::next' is not accessible
Error 24task.CPP 110: 'Item::next' is not accessible


Все ошибки находятся в функции Item *findEnd()
Видимо, функция не получает доступ к атрибуту класса List::first и атрибуту класса Item::next, но почему, я не понимаю.
Post #: 1
RE: Список в С++: где ошибка? - 2008-12-21 15:38:52.146666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
А с чего ты решил, что левая функция должна получать в ним доступ?
Post #: 2
RE: Список в С++: где ошибка? - 2008-12-21 19:03:25.740000   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
в каком смысле левая? Что в ней плохого?
Post #: 3
RE: Список в С++: где ошибка? - 2008-12-21 19:57:41.770000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Ну какого х она должна иметь права доступа к членам твоего класса?… Рано ты за ООП взялся, начни с теории лучше. Без неё только мозги себе покалечишь.
Post #: 4
RE: Список в С++: где ошибка? - 2008-12-21 23:09:30.460000   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
Ну а как сделать чтоб имела доступ?

К теме о "Рано ты за ООП взялся, начни с теории лучше":
не ошибается только тот, кто ничего не делает.
Post #: 5
RE: Список в С++: где ошибка? - 2008-12-22 02:08:50.476666   
Archivarius

Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000
quote:

ORIGINAL: t3rmin41

Ну а как сделать чтоб имела доступ?
{
Так это ты вобще написал?
Ничего подозрительного в своем коде не замечаешь?
Конкретно тут:

class List
{
…..
private:
Item *findEnd();
Item *first;
}

Item *findEnd()
{
Item *curr;
curr=first;
…..
}
Post #: 6
RE: Список в С++: где ошибка? - 2008-12-22 03:42:35.180000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333

quote:

ORIGINAL: t3rmin41

К теме о "Рано ты за ООП взялся, начни с теории лучше":
не ошибается только тот, кто ничего не делает.

С твоим подходом ты будешь очень долго ошибаться. Не стоит изобретать велосипед, когда есть отлаженные методики обучения. Думаю ты не Крис Касперски, который с помощью одной лишь debug.com за 3 месяца освоил язык ассемблера. В общем лучше почитать книжки, чем лишний раз грузить нас глупыми вопросами.
Post #: 7
RE: Список в С++: где ошибка? - 2008-12-22 12:23:31.013333   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
quote:

ORIGINAL: Archivarius

quote:

ORIGINAL: t3rmin41

Ну а как сделать чтоб имела доступ?
{
Так это ты вобще написал?
Ничего подозрительного в своем коде не замечаешь?
Конкретно тут:

class List
{
…..
private:
Item *findEnd();
Item *first;
}

Item *findEnd()
{
Item *curr;
curr=first;
…..
}


по-моему, надо в функцию *findEnd() давать какой-то параметр класса List [например *findEnd(List a)], а потом уже curr=a.first. Это единственное, что вызывает у меня подозрения. Но вообще-то я эту функцию у препода списал, поэтому не думал, что где-то тут серьёзная ошибка.

quote:

ORIGINAL: _SaZ_

quote:

ORIGINAL: t3rmin41

К теме о "Рано ты за ООП взялся, начни с теории лучше":
не ошибается только тот, кто ничего не делает.

С твоим подходом ты будешь очень долго ошибаться. Не стоит изобретать велосипед, когда есть отлаженные методики обучения. Думаю ты не Крис Касперски, который с помощью одной лишь debug.com за 3 месяца освоил язык ассемблера. В общем лучше почитать книжки, чем лишний раз грузить нас глупыми вопросами.


Не стану полемизировать насчёт глупых вопросов и чтения книжек, скажу только, что я редко повторяю одну и ту же ошибку дважды.
Post #: 8
RE: Список в С++: где ошибка? - 2008-12-22 13:45:09.233333   
Archivarius

Сообщений: 164
Оценки: 0
Присоединился: 2008-10-26 00:16:25.630000
quote:

ORIGINAL: t3rmin41

по-моему, надо в функцию *findEnd() …..
Вот именно, что это у тебя получается не метод класса, а функция. Абсолютно никаким образом не связанная с классом List.
Посмотри на другие методы, чем их объявление отличается?
Post #: 9
RE: Список в С++: где ошибка? - 2008-12-22 14:31:43.580000   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
Да, точно. Item* List::findEnd(); надо объявлять. Только теперь почему-то программа не может корректно завершиться
Post #: 10
RE: Список в С++: где ошибка? - 2008-12-22 15:12:08.030000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Потому что надо с памятью нормально работать.
Post #: 11
RE: Список в С++: где ошибка? - 2008-12-22 22:32:35.456666   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
Вот, переписал по-другому структуру списка. Мои функции-методы только cut, addvalues и add, всё остальное писал препод, но всё равно функции-методы append не работают. В принципе, непринципиально, 9 (по 10 бальной системе) я уже получил, но всё же, почему они не работают? С первого взгляда всё так, как надо написано… препод наверно, где-то совершил ошибку, только вот где?

Вот код:

#include &lt;assert.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; class Item { &nbsp;friend class List; &nbsp; &nbsp;private: &nbsp;Item(double value, Item *item=0) {val=value; next=item; }; &nbsp;double val; &nbsp;Item *next; }; class List { &nbsp;public: &nbsp;List(double a=0); &nbsp;List(double *, int); &nbsp;List(List&amp;); &nbsp;void out(char *); ~List() { remove(); }; &nbsp;int length() {return im; }; &nbsp;void remove(); &nbsp;void remove(int); &nbsp;void append(double); &nbsp;void append(double *, int); &nbsp;void add(double); &nbsp;void addvalues(double *, int); &nbsp;void cut(int); &nbsp;double &amp;operator [](int); &nbsp;private: &nbsp;Item *findEnd(); &nbsp;Item *first; &nbsp;int im; }; List::List(double a) { &nbsp;Item *curr=new Item(a); &nbsp;assert(curr!=0); &nbsp;first=curr; &nbsp;im=1; } List::List(double *mas, int num) { &nbsp;int i; Item *prev,*curr; &nbsp;curr=new Item(mas[0]); &nbsp;assert(curr!=0); &nbsp;prev=first=curr; &nbsp;for(i=1; i&lt;num; i++) &nbsp;{ &nbsp; curr = new Item(mas[i]); &nbsp; assert(curr!=0); &nbsp; prev-&gt;next=curr; &nbsp; prev=curr; &nbsp;} &nbsp;im=num; } List::List(List &amp;lem) { &nbsp;int i; Item *curr,*prev,*pt; &nbsp;pt=lem.first; &nbsp; &nbsp;curr = new Item(pt-&gt; val); &nbsp;assert(curr!=0); &nbsp;prev=first=curr; &nbsp; &nbsp;for(i=1; i&lt;lem.im; i++) &nbsp;{ &nbsp; pt=pt-&gt;next; &nbsp; curr=new Item(pt-&gt;val); &nbsp; assert(curr!=0); &nbsp; prev-&gt;next=curr; &nbsp; prev=curr; &nbsp;} &nbsp;im=lem.im; } void List::remove() { &nbsp;Item *pt=first; &nbsp;while(pt) &nbsp;{ &nbsp; Item *pnt=pt; &nbsp; pt=pt-&gt;next; &nbsp; delete pnt; &nbsp;} &nbsp;im=0; } Item* List::findEnd() { &nbsp;Item *curr; &nbsp;curr=first; &nbsp; &nbsp;while(curr-&gt;next); &nbsp; curr=curr-&gt;next; &nbsp;return curr; } void List::remove(int num) { &nbsp;assert(num&lt;im); &nbsp;int i=0; &nbsp;Item *prev,*curr; &nbsp;im-=num; &nbsp;prev=curr=first; &nbsp;while (i&lt;im) &nbsp;{ &nbsp;&nbsp;&nbsp; prev=curr; &nbsp;&nbsp;&nbsp; curr=curr-&gt;next; &nbsp;&nbsp;&nbsp; i++; &nbsp;} &nbsp;while(curr) &nbsp;{ &nbsp;&nbsp;&nbsp; Item *pnt=curr; &nbsp;&nbsp;&nbsp; curr=curr-&gt;next; &nbsp;&nbsp;&nbsp; delete pnt; &nbsp;} &nbsp;prev-&gt;next=0; } void List::out(char *name) { &nbsp;printf("%s&nbsp; im=%d\n",name,im); &nbsp; &nbsp;Item *curr; int num=0; curr=first; &nbsp; &nbsp;while (curr) &nbsp;{ &nbsp;&nbsp;&nbsp; printf("%3.f ",curr-&gt;val); &nbsp; curr=curr-&gt;next; &nbsp; num++; &nbsp; &nbsp; if ((num%5)==0) &nbsp;&nbsp; printf("\n"); &nbsp;} &nbsp;&nbsp;&nbsp; printf("\n"); } &nbsp; void List::append(double value) { &nbsp;Item *curr; &nbsp;Item *pt=new Item(value); &nbsp;assert(pt!=0); &nbsp;curr=findEnd(); &nbsp;curr-&gt;next=pt; &nbsp;im++; } void List::append(double *mas, int num) { &nbsp;if (num&lt;=0) return; &nbsp;int i; Item *curr,*prev; &nbsp;prev=findEnd(); &nbsp; &nbsp;for(i=0; i&lt;num; i++) &nbsp;{ &nbsp; curr=new Item(mas[i]); &nbsp; assert(curr!=0); &nbsp; prev-&gt;next=curr; &nbsp; prev=curr; &nbsp;} &nbsp;im+=num; } double &amp;List::operator [](int num) { &nbsp;Item *curr, *prev; &nbsp;int i,ifin; &nbsp;assert(num&gt;=0); &nbsp; &nbsp;if (num&lt;im) &nbsp;{ &nbsp; prev=first; &nbsp; &nbsp; while(num&gt;0) &nbsp; { &nbsp;&nbsp; prev=prev-&gt;next; &nbsp;&nbsp; num--; &nbsp; } &nbsp;} &nbsp;else &nbsp;{ &nbsp; prev=findEnd(); &nbsp; ifin=num-im+1; &nbsp;&nbsp; &nbsp; for(i=0; i&lt;ifin; i++) &nbsp; { &nbsp;&nbsp; curr=new Item(0.0); &nbsp;&nbsp; assert(curr!=0); &nbsp;&nbsp; prev-&gt;next=curr; &nbsp;&nbsp; prev=curr; &nbsp; } &nbsp; im=num+1; &nbsp;} &nbsp;return prev-&gt;val; } void List::add(double value) { &nbsp;Item *curr; &nbsp;Item *pt=new Item(value); &nbsp;curr=first; &nbsp;pt-&gt;next=curr; &nbsp;this-&gt;first=pt; &nbsp;this-&gt;im++; } void List::addvalues(double *mas, int n) { &nbsp;int i; &nbsp;for (i=n-1; i&gt;=0; i--) &nbsp;{ &nbsp;&nbsp;&nbsp; this-&gt;add(mas[i]); &nbsp;} } void List::cut(int num) { &nbsp;assert(num&lt;im); &nbsp;Item *curr; &nbsp;for(int i=0; i&lt;num; i++) &nbsp;{ &nbsp;&nbsp;&nbsp; curr=first; &nbsp;&nbsp;&nbsp; curr=curr-&gt;next; &nbsp;&nbsp;&nbsp; delete first; &nbsp;&nbsp;&nbsp; first=curr; &nbsp;&nbsp;&nbsp; im--; &nbsp;} } main() { &nbsp;double a[]={1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0}; &nbsp;double b[]={11.0, 12.0, 13.0, 14.0, 15.0}; &nbsp;clrscr(); &nbsp;List list1(a, 8); &nbsp;list1.out("list1"); &nbsp;list1.remove(3); &nbsp;list1.out("list1 after truncation"); &nbsp;//list1.append(3.0); &nbsp;//list1.out("list1 after append(3.0)"); &nbsp;list1.cut(2); &nbsp;list1.out("list1 after cut(2)"); &nbsp;list1.addvalues(b,3); &nbsp;list1.out("list1 after addvalues(b,3)"); &nbsp;getch(); &nbsp;return 0; }
Post #: 12
RE: Список в С++: где ошибка? - 2008-12-22 22:38:12.380000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: t3rmin41

Мои функции-методы только cut, addvalues и add, всё остальное писал препод


препода публично четвертовать
Post #: 13
RE: Список в С++: где ошибка? - 2008-12-23 00:40:48.410000   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
quote:

ORIGINAL: Denaturat

quote:

ORIGINAL: t3rmin41

Мои функции-методы только cut, addvalues и add, всё остальное писал препод


препода публично четвертовать


Если так, то только в следующем семестре это возможно :)
Post #: 14
RE: Список в С++: где ошибка? - 2008-12-23 01:05:36.610000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: t3rmin41

Если так, то только в следующем семестре это возможно :)


передай ему что это не C++, не ООП, и, вообще говоря, не список. а ещё не забудь сказать, что (cons 'vsl ('not dead))
Post #: 15
RE: Список в С++: где ошибка? - 2008-12-23 14:53:42.883333   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
quote:

ORIGINAL: Denaturat

quote:

ORIGINAL: t3rmin41

Если так, то только в следующем семестре это возможно :)


передай ему что это не C++, не ООП, и, вообще говоря, не список. а ещё не забудь сказать, что (cons 'vsl ('not dead))


Я предпочитаю подкреплять свои слова аргументами. Поэтому попрошу и тебя тоже самое сделать :)
Почему это не С++, не ООП?
И что такое cons 'vsl ('not dead))?
Post #: 16
RE: Список в С++: где ошибка? - 2008-12-23 16:02:12.180000   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: t3rmin41

Почему это не С++


например потому, что в C++ есть ключевое слово const, а используемый оператор new никогда не возвращает нулевого указателя (он кидает исключение). кроме того в этом языке есть, например, список инициализации, и ключевое слово explicit для одноаргументных конструкторов. достаточно? то, что используется исключительно C STDLib (а не C++ STDLib) может ещё и оправдано учебными целями, но вот вышеперечисленное - никоим образом

quote:

ORIGINAL: t3rmin41

не ООП?


ну, честно говоря ООП здесь не нужно вообще; здесь нужно ОБП, объектно-базированное программирование - тебе нужно описать абстрактный тип данных "список". средств для этого у тебя не так уж и много, но ключевое - инкапсуляция - здесь нарушается. Item не должен быть friend-классом, это не тот уровень абстракции - он должен быть локальным классом, объявленный в private-секции List (а лучше - структурой, на кой чёрт там вообще класс, это же cons-ячейка). интерфейс не соответствует списочной структуре: что за operator[]? нет у списка такого селектора, он неэффективен и поэтому не нужен. всё остальное - в том же духе

quote:

ORIGINAL: t3rmin41

И что такое cons 'vsl ('not dead))?


а это ты либо сам со временем поймёшь, либо оно тебе и не надо
Post #: 17
RE: Список в С++: где ошибка? - 2008-12-23 18:12:00.120000   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
quote:

ORIGINAL: Denaturat

quote:

ORIGINAL: t3rmin41

Почему это не С++


например потому, что в C++ есть ключевое слово const, а используемый оператор new никогда не возвращает нулевого указателя (он кидает исключение). кроме того в этом языке есть, например, список инициализации, и ключевое слово explicit для одноаргументных конструкторов. достаточно? то, что используется исключительно C STDLib (а не C++ STDLib) может ещё и оправдано учебными целями, но вот вышеперечисленное - никоим образом



Может, не const, а constructor? const вроде как для константы используется (наряду с #define). Если ты это имел в виду. Это первое. Во-вторых, я не знаю что там возвращает new, препод объяснял, что new создаёт новый (или указатель) объект в памяти, называемой HEAP, если не удалось создать, то указатель будет указывать в NULL. За что купил, за то и продаю (эт я про себя :)).

quote:


quote:

ORIGINAL: t3rmin41

не ООП?


ну, честно говоря ООП здесь не нужно вообще; здесь нужно ОБП, объектно-базированное программирование - тебе нужно описать абстрактный тип данных "список". средств для этого у тебя не так уж и много, но ключевое - инкапсуляция - здесь нарушается. Item не должен быть friend-классом, это не тот уровень абстракции - он должен быть локальным классом, объявленный в private-секции List (а лучше - структурой, на кой чёрт там вообще класс, это же cons-ячейка). интерфейс не соответствует списочной структуре: что за operator[]? нет у списка такого селектора, он неэффективен и поэтому не нужен. всё остальное - в том же духе



Ну со структурой-то понятно, в принципе, и в самом деле класс Item не имеет никаких методов (имеет правда, один конструктор, но по идее можно и без него обойтись), тут ты прав. А operator [] я могу объяснить, зачем нужен. Он нужен для того, чтобы продлить массив, как-то: если в списке 5 элементов, а пишешь например list1[7]=9.0, то будет сделано как MathCAD или где-там, не помню:
5 элементов останутся, а вместо 6-ого запишется 0.0, а 7-ой как раз будет равен 9.0. Такая идея.

quote:


quote:

ORIGINAL: t3rmin41

И что такое cons 'vsl ('not dead))?


а это ты либо сам со временем поймёшь, либо оно тебе и не надо


ОК, как скажешь :)

Только мы честно говоря, от темы отошли. Есть конкретный вопрос - почему не работает ни один из append'ов?
Post #: 18
RE: Список в С++: где ошибка? - 2008-12-23 18:40:25.276666   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
quote:

ORIGINAL: t3rmin41

const вроде как для константы используется (наряду с #define). Если ты это имел в виду. Это первое


можно было просто сказать что ты не знаешь, для чего в C++ квалификатор const. ну так почитай, про константные аргументы функций почитай, про константные указатели, указатели на константу; про константные методы и квалификатор mutable (физическую и логическую константность); если не надоест - про идемпотентность и мутабельные данные вообще

quote:

ORIGINAL: t3rmin41

Во-вторых, я не знаю что там возвращает new, препод объяснял, что new создаёт новый (или указатель) объект в памяти, называемой HEAP, если не удалось создать, то указатель будет указывать в NULL. За что купил, за то и продаю (эт я про себя :)).


итого как работает new ты тоже не знаешь. позволь немного поясню…обычный operator new выполняет несколько последовательных операций - вызывает operator operator new (да, так всё страшно), который возвращает ему указатель на область выделенной памяти (может сделать это с помощью malloc, но вообще говоря не обязан); конструирует объект в соответствии с аргументами вызванного конструктора; размещает объект в выделенной под него области, и возвращает указатель, приведённый к типу размещённого объекта. в случае, если память выделить не удалось (или конструктор объекта бросил исключение), operator new сам бросает исключение - нормальная работа программы прерывается. нулевого указателя new не возвращает никогда

вообще говоря это не единственная форма работы operator new - есть ещё new, не бросающий исключений, размещающий new (который не выделяет память, т.е. не вызывает operator operator new); есть new для массивов, который работает ещё более иначе - по всем этим увлекательным темам читай Страуструпа и Саттера. вы используете в коде самый обычный, классический new, поэтому имейте в виду - он себя будет вести именно классически, т.е. по стандарту

кстати, совсем не обязательно new выделяет память именно в куче (heap): operator operator new можно перегрузить под свои нужды; как, впрочем, и сам operator new

quote:

ORIGINAL: t3rmin41

Ну со структурой-то понятно, в принципе, и в самом деле класс Item не имеет никаких методов (имеет правда, один конструктор, но по идее можно и без него обойтись), тут ты прав. А operator [] я могу объяснить, зачем нужен. Он нужен для того, чтобы продлить массив, как-то: если в списке 5 элементов, а пишешь например list1[7]=9.0, то будет сделано как MathCAD или где-там, не помню:
5 элементов останутся, а вместо 6-ого запишется 0.0, а 7-ой как раз будет равен 9.0. Такая идея.


интерфейс должен быть таким, чтобы объект было легко использовать правильно, и трудно - неправильно; operator[] есть оператор индексирования, он просто-таки напрашивается для выборки элементов из списка - а это есть зло. то, о чём ты говоришь - это уже более сложная структура данных чем список, и по-хорошему её интерфейс должен быть весьма отличен от имеющегося



quote:

ORIGINAL: t3rmin41

Только мы честно говоря, от темы отошли. Есть конкретный вопрос - почему не работает ни один из append'ов?


понятия не имею. тебя не научили отлаживать код? так самое время научиться!
Post #: 19
RE: Список в С++: где ошибка? - 2008-12-23 19:00:04.010000   
t3rmin41

Сообщений: 245
Оценки: 0
Присоединился: 2007-11-12 14:06:01.393333
Ладно, раз никто не может и не хочет найти ошибку, я сам её нашёл - в функции Item* List::findEnd() есть такое

&nbsp;while(curr-&gt;next); &nbsp; curr=curr-&gt;next;
т.е. надо после while убрать точку с запятой и всё пойдёт как надо. Ура :)
Post #: 20
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Список в С++: где ошибка?







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.