Здравствуйте.
Вот написанный код, и я уже не совсем его понимаю. Помогите разобраться, исправить ошибки.
В общем, нужно было создать список с возможностью добавления нового элемента в конец списка, удаление первого/последнего элемента, поиск и возвращение элемента с заданным id.
При попытке компиляции под gcc, много ошибок, мол, многие переменные не заданы и видимо совсем не распознает структуру Link в других функциях(нет декларации first, last, некорректная инициализация внутри класса статического элемента данных нецелочисленного типа «link*», ISO C++ запрещает инициализацию элемента «last» [-fpermissive], ошибка: в результате которой «first» становится статическим [-fpermissive] и тд)
Очень хотелось бы разобраться.

UPD
читать дальше

@темы: C++

Комментарии
27.10.2012 в 18:53

И тесно облакам.
Код совершенно безумный, синтаксису C++ он не соответствует абсолютно. Почитайте о том, как создавать и использовать классы в C++. Вот часть ошибок:

"class ListItem {static:" - такой конструкции, по-моему, вообще нет. После "class MyClass {" надо добавить модификатор доступа "public: ". В перечислении методов пропущены точки с запятыми. Пропущена точка c запятой после объявления класса. Не указано имя класса при определении методов. Методы Add, Remove объявлены как возвращающие int, хотя они ничего не возвращают (надо void). Функция main вообще неправильная.

И на будущее: не надо пересказывать ошибки компилятора своими словами.
27.10.2012 в 20:12

Ri, спасибо за отклик.
В оп-посте теперь слегка подправленная версия.

>>Не указано имя класса при определении методов.
Это где объявлять и как?
Как должна выглядеть main, в таком случае?
И в какой части кода лучше объявлять len, id?
27.10.2012 в 20:23

И тесно облакам.
Переменную len нужно перенести внутрь класса MyClass. Значение 0 ей нужно ставить в конструкторе, который придется для этого создать. В конструктор также нужно перенести инициализацию переменных first, last. В теле класс инициализировать поля нельзя.

Глобальная переменная id вам не нужна.

Вместо "void RemLast() { ..." надо писать "void MyClass::RemLast() {".

Структура link у вас внутри класса ListItem, это совершенно излишне. В C++ структура - это простейший класс, поэтому struct можно заменить на class и добавить "public:", а внешний класс ListItem нужно убрать. Соответственно, обращение "struct link" изменится на "link".

Функция main может выглядеть так:

int main() {
MyClass object;
object.Add(15);
object.Add(24);
object.Add(7);
object.Show();
}

Ваш список хранит целые числа. Вам это и нужно? Бывает, что нужно написать список, который может хранить объекты любого типа. Там задействуется шаблонная магия и всё становится немного по-другому.
27.10.2012 в 21:42

С конструктором не все понятно. Какой тип должен стоять для *first, *last?

Да, здесь список с целыми числами. Хотя про список с объектами любого типа тоже хотелось бы узнать.
27.10.2012 в 21:48

И тесно облакам.
С конструктором не все понятно.
class MyClass { 
MyClass();
...
};

MyClass::MyClass() {
first = NULL;
Last = NULL;
len = 0;
}


Какой тип должен стоять для *first, *last?
Раз уж вы убрали link и оставили вместо него ListItem, то вам нужно везде заменить link на ListItem (в т.ч. внутри ListItem).
27.10.2012 в 22:07

Теперь так?
27.10.2012 в 22:17

И тесно облакам.
gist.github.com/3965572
Я тут вам исправил остальное. Не ручаюсь, что всё правильно, но оно хотя бы компилится и пишет то, что надо.
27.10.2012 в 22:51

Ri, спасибо большое за помощь и разъяснения =)

И у меня еще вопрос будет: что нужно, чтобы все функции заработали из консоли?
27.10.2012 в 22:54

И тесно облакам.
И у меня еще вопрос будет: что нужно, чтобы все функции заработали из консоли?
Не понял вопрос, поясните.
27.10.2012 в 22:59

Показать как они работают.
Добавить, удалить, найти элемент.
27.10.2012 в 23:07

И тесно облакам.
Это нетривиально. Можно сделать так, например: сначала спрашиваем тип операции (1 - добавить, 2 - удалить, 3 - найти), потом в зависимости от введенной цифры действуем дальше, запрашиваем у юзера значение (если нужно), выполняем операцию и отображаем результат. А вам это точно нужно? Обычно, чтобы показать, как всё работает, достаточно в main написать соответствующие команды.
27.10.2012 в 23:14

Понятно. Думаю, что не нужно все же.
Еще раз спасибо за помощь)
28.10.2012 в 12:48

Корректно работает только Add(хотя в этом тоже нет особой уверенности).
После попытки изменения RemFirst при пустом списке возникает ошибка сегментирования.


28.10.2012 в 13:42

Исправилось изменением условия if(first==NULL).
Хотя все еще непонятно почему возникала ошибка.

А как переработать две другие функции, чтобы все заработало я вообще не знаю.
28.10.2012 в 14:51

И тесно облакам.
Вообще, тут всё еще много ошибок, сразу так всё и не перечислишь. Что конкретно у вас сейчас не работает и как именно оно не работает? И дайте ваш текущий код.
28.10.2012 в 15:15

Ошибки логического характера?
RemLast() удаляет все элементы кроме первого в списке.
При GetItem() просто выводится список. Ее действие заметно только если id>len - здесь все правильно, выдает ошибку.
Текущий код опять в оп-посте.
30.10.2012 в 10:31



В RemFirst тоже память течёт, но это уже сами. Чтобы собиралось с ассертами, подключай assert.h и снимай с них комменты.
А "удаляло" оно весь список потому, что за ифами нужно следить:
if(first->next=NULL)
30.10.2012 в 21:49

.Седьмой, спасибо, теперь RemLast работает. Не поясните вот эту строчку в конце: p=p->next; ?

>>память течёт
Здесь тоже не совсем понимаю.
30.10.2012 в 22:05

И тесно облакам.
Не поясните вот эту строчку в конце: p=p->next; ?
Это просто проход по списку, переход к следующему элементу. У вас то же самое в Show() написано: " current = current->next;".

память течёт
У вас создаются объекты ListItem через new. Соответственно, вам их надо через delete удалить, чтобы память освободилась. А у вас просто зануляется указатель на объект. Указатель потеряли, delete не сделали - память осталась занятой. Это и есть утечка памяти.
30.10.2012 в 22:10

Ri, понятно.
И еще, вы говорили, что здесь по-прежнему много ошибок. Не укажете где?

И с GetItem не все ясно.
02.11.2012 в 18:51

GetItem, не выводится значение элемента.


08.11.2012 в 19:05

Вижу свою ошибку ^^"



Не посмотрите, что в общем коде еще можно доработать/исправить?