Здравствуйте.
Вот написанный код, и я уже не совсем его понимаю. Помогите разобраться, исправить ошибки.
В общем, нужно было создать список с возможностью добавления нового элемента в конец списка, удаление первого/последнего элемента, поиск и возвращение элемента с заданным id.
При попытке компиляции под gcc, много ошибок, мол, многие переменные не заданы и видимо совсем не распознает структуру Link в других функциях(нет декларации first, last, некорректная инициализация внутри класса статического элемента данных нецелочисленного типа «link*», ISO C++ запрещает инициализацию элемента «last» [-fpermissive], ошибка: в результате которой «first» становится статическим [-fpermissive] и тд)
Очень хотелось бы разобраться.
UPD
читать дальше
Вот написанный код, и я уже не совсем его понимаю. Помогите разобраться, исправить ошибки.
В общем, нужно было создать список с возможностью добавления нового элемента в конец списка, удаление первого/последнего элемента, поиск и возвращение элемента с заданным id.
При попытке компиляции под gcc, много ошибок, мол, многие переменные не заданы и видимо совсем не распознает структуру Link в других функциях(нет декларации first, last, некорректная инициализация внутри класса статического элемента данных нецелочисленного типа «link*», ISO C++ запрещает инициализацию элемента «last» [-fpermissive], ошибка: в результате которой «first» становится статическим [-fpermissive] и тд)
Очень хотелось бы разобраться.
UPD
читать дальше
-
-
27.10.2012 в 18:53"class ListItem {static:" - такой конструкции, по-моему, вообще нет. После "class MyClass {" надо добавить модификатор доступа "public: ". В перечислении методов пропущены точки с запятыми. Пропущена точка c запятой после объявления класса. Не указано имя класса при определении методов. Методы Add, Remove объявлены как возвращающие int, хотя они ничего не возвращают (надо void). Функция main вообще неправильная.
И на будущее: не надо пересказывать ошибки компилятора своими словами.
-
-
27.10.2012 в 20:12В оп-посте теперь слегка подправленная версия.
>>Не указано имя класса при определении методов.
Это где объявлять и как?
Как должна выглядеть main, в таком случае?
И в какой части кода лучше объявлять len, id?
-
-
27.10.2012 в 20:23Глобальная переменная 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Да, здесь список с целыми числами. Хотя про список с объектами любого типа тоже хотелось бы узнать.
-
-
27.10.2012 в 21:48class 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Я тут вам исправил остальное. Не ручаюсь, что всё правильно, но оно хотя бы компилится и пишет то, что надо.
-
-
27.10.2012 в 22:51И у меня еще вопрос будет: что нужно, чтобы все функции заработали из консоли?
-
-
27.10.2012 в 22:54Не понял вопрос, поясните.
-
-
27.10.2012 в 22:59Добавить, удалить, найти элемент.
-
-
27.10.2012 в 23:07-
-
27.10.2012 в 23:14Еще раз спасибо за помощь)
-
-
28.10.2012 в 12:48После попытки изменения RemFirst при пустом списке возникает ошибка сегментирования.
-
-
28.10.2012 в 13:42Хотя все еще непонятно почему возникала ошибка.
А как переработать две другие функции, чтобы все заработало я вообще не знаю.
-
-
28.10.2012 в 14:51-
-
28.10.2012 в 15:15RemLast() удаляет все элементы кроме первого в списке.
При GetItem() просто выводится список. Ее действие заметно только если id>len - здесь все правильно, выдает ошибку.
Текущий код опять в оп-посте.
-
-
30.10.2012 в 10:31В RemFirst тоже память течёт, но это уже сами. Чтобы собиралось с ассертами, подключай assert.h и снимай с них комменты.
А "удаляло" оно весь список потому, что за ифами нужно следить:
if(first->next=NULL)
-
-
30.10.2012 в 21:49>>память течёт
Здесь тоже не совсем понимаю.
-
-
30.10.2012 в 22:05Это просто проход по списку, переход к следующему элементу. У вас то же самое в Show() написано: " current = current->next;".
память течёт
У вас создаются объекты ListItem через new. Соответственно, вам их надо через delete удалить, чтобы память освободилась. А у вас просто зануляется указатель на объект. Указатель потеряли, delete не сделали - память осталась занятой. Это и есть утечка памяти.
-
-
30.10.2012 в 22:10И еще, вы говорили, что здесь по-прежнему много ошибок. Не укажете где?
И с GetItem не все ясно.
-
-
02.11.2012 в 18:51-
-
08.11.2012 в 19:05Не посмотрите, что в общем коде еще можно доработать/исправить?