Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 11.08.2011, 09:40   #16
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: С++ и Блитц Параллели

вроде разобрался со связанным списком и его перебором.. но не могу быть до конца уверен, корректно ли я удаляю объект класса.. не остается ли мусора в памяти после этого. ведь 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;
}
(Offline)
 
Ответить с цитированием
Старый 11.08.2011, 13:08   #17
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: С++ и Блитц Параллели

Конечно же, удаление неверное.
Вообще, зачем городить свой велосипед, если есть STL? Единственная причина не использовать STL - это если ты знаешь, что напишешь более быструю реализацию конкретно для решения своей узкой задачи.
__________________

(Offline)
 
Ответить с цитированием
Старый 11.08.2011, 13:28   #18
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: С++ и Блитц Параллели

причина городить свои велосипеды - это понимать, как работают те или другие вещи...
хорошая практика по работе с указателями.
если всё таки допустить, что вышеописанная корявость имеет право на существование, то как бы удалил выбранный объект ты? если не трудно, опиши подробнее, пожалуйста... цель ведь научиться
(Offline)
 
Ответить с цитированием
Старый 11.08.2011, 14:10   #19
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений
(для 4,642 пользователей)
Ответ: С++ и Блитц Параллели

object = 0;
 delete(object);
object = 0; убрать. Потому что в теле оператора delete стоит проверка на нулевой аргумент, который приводит к простому выходу из тела оператора. Поэтому кажется, что все работает.

if (pCurrent->id ==2)
 {
 pCurrent->age = 666;
 PersonDeleteObject(pCurrent);
 }
заменяешь на
if (pCurrent->id ==2)
{
	pCurrent->age = 666;
	Person* toDestroy = pCurrent;
	pCurrent = pCurrent->pNext;
	PersonDeleteObject(toDestroy);
}
Почему именно так - разбирайся сам с дебаггером, коли решил глубоко изучать.

ЗЫ. return писать не надо, если функция возвращает void.
ЗЗЫ. Ты что, действительно, пишешь с таким форматированием (точнее, без него)?!
__________________

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Vadimich (11.08.2011)
Старый 11.08.2011, 14:12   #20
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: С++ и Блитц Параллели

спасибо .Squid
(Offline)
 
Ответить с цитированием
Старый 11.08.2011, 14:21   #21
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: С++ и Блитц Параллели

ЗЗЫ: да не.. просто так вставилось )
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 06:53.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com