Вобщем, есть вопросик. Делаю односвязный список. Естественно, это класс и структура. Вообщем видел другие, функцию добавления элемента, пишут через new Item, я же просто объявляю Item. Вроде бы по отладке все пашет, но когда вызываю функцию вывода, значения поинтеров firstItem и lastItem теряются... Может кто сможет помочь? Вроде бы при обычном объявлении должна тоже выделяться память (Item itm;)
List.h
#pragma once
class List
{
struct Item {
int number;
Item * next;
};
int countAll;
Item * firstItem = NULL;
Item * lastItem = NULL;
public:
void AddLast(int);
void RemoveLast();
void ShowAllElements();
void showItem(Item *);
List();
~List();
};
list.cpp
#include "stdafx.h"
#include "List.h"
#include <iostream>
using namespace std;
void List::AddLast(int n)
{
Item itm = { n, NULL };
/*itm->next = NULL;
itm->number = n;*/
if (firstItem == lastItem) {
firstItem = &itm;
lastItem = firstItem->next;
}
else {
lastItem = &itm;
lastItem->next = itm.next;
lastItem = lastItem->next;
}
}
void List::RemoveLast()
{
Item * tmp;
tmp = lastItem->next;
delete lastItem;
lastItem = tmp;
}
void List::ShowAllElements()
{
Item *next = firstItem->next;
Item *itm = firstItem;
while (next) {
showItem(itm);
itm = itm->next;
next = itm->next;
}
}
void List::showItem(Item * itm) {
cout << "there is number: " << itm->number << endl;
}
List::List()
{
Item itm;
this->firstItem = this->lastItem = &itm;
}
List::~List()
{
}
main
// OneRootList.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include "List.h"
#include <iostream>
using namespace std;
int main()
{
List list;
list.AddLast(1);
list.AddLast(1);
list.ShowAllElements();
}
void List::AddLast(int n)
{
// создали ЛОКАЛЬНУЮ переменную
Item itm = { n, NULL };
/* ... */
// присвоили её адрес...
firstItem = &itm;
// а вот тут локальня переменная itm уничтожается, и
// firstItem теперь указывает в никуда
}
Та же проблема и в конструкторе. И при этом ещё и в методе RemoveLast() вы применяете delete к памяти, которая вообще непонятно что из себя представляет.
Выводы:
newАпостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости