![]() |
Ответ: С++ и Блитц Параллели
вроде разобрался со связанным списком и его перебором.. но не могу быть до конца уверен, корректно ли я удаляю объект класса.. не остается ли мусора в памяти после этого. ведь object, являющийся указателем, сначала обнуляется.. но по другому delete применить не получилось
посмотрите, пожалуйста: //-------------------------------- #include "stdafx.h" #include <iostream> using namespace std; // Создаем новый класс class Person { public: int age,id,health; Person* pNext;// указатель на следующий объект списка }; Person* pRoot = 0; // указатель на основание списка // создание основания класса void PersonAddRoot() { Person* object = new Person; object->pNext = pRoot; pRoot = object; return; } // создание нового объекта с добавлением в список void PersonAddObject() { if (pRoot == 0) // если основание списка не было создано... { PersonAddRoot();// ... создаем основание } Person* object = new Person; // создаем новый объект Person* pCurrent = pRoot; // создаем указатель на основание списка int index=0; // инициализируем счетчик ID while(pCurrent->pNext != 0)// ищем конец списка { index++; pCurrent = pCurrent->pNext; } pCurrent->pNext = object; //устанавливаем указатель предыдущего объекта на новый объект object->pNext = 0; object->id = index; object->health = 10; object->age = index*3; return; } void PersonShowList() { Person* pCurrent = pRoot; // создаем указатель на основание списка while(pCurrent->pNext != 0) { pCurrent = pCurrent->pNext; cout << "id: " <<pCurrent->id << " age: " << pCurrent->age << " health: " << pCurrent->health << endl; } return; } void PersonDeleteObject(Person* object) { Person* pCurrent = pRoot; while(pCurrent->pNext != object) { pCurrent = pCurrent->pNext; } pCurrent->pNext = object->pNext; object->pNext = 0; object = 0; delete(object); return; } void PersonUpdate() // обновляем объекты типа и проверяем, какой удалить { Person* pCurrent = pRoot; while(pCurrent->pNext !=0) { pCurrent = pCurrent->pNext; if (pCurrent->id ==2) { pCurrent->age = 666; PersonDeleteObject(pCurrent); } } return; } int main() { for(int i=0;i<6;i++) { PersonAddObject(); // создаем объекты } PersonUpdate(); перебираем и удаляем через условие PersonShowList(); отображение return 0; } |
Ответ: С++ и Блитц Параллели
Конечно же, удаление неверное.
Вообще, зачем городить свой велосипед, если есть STL? Единственная причина не использовать STL - это если ты знаешь, что напишешь более быструю реализацию конкретно для решения своей узкой задачи. |
Ответ: С++ и Блитц Параллели
причина городить свои велосипеды - это понимать, как работают те или другие вещи...
хорошая практика по работе с указателями. если всё таки допустить, что вышеописанная корявость имеет право на существование, то как бы удалил выбранный объект ты? если не трудно, опиши подробнее, пожалуйста... цель ведь научиться :) |
Ответ: С++ и Блитц Параллели
Код:
object = 0; Код:
if (pCurrent->id ==2) Код:
if (pCurrent->id ==2) ЗЫ. return писать не надо, если функция возвращает void. ЗЗЫ. Ты что, действительно, пишешь с таким форматированием (точнее, без него)?! |
Ответ: С++ и Блитц Параллели
спасибо .Squid
|
Ответ: С++ и Блитц Параллели
ЗЗЫ: да не.. просто так вставилось )
|
Часовой пояс GMT +4, время: 11:13. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot