forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   С++ и Блитц Параллели (http://forum.boolean.name/showthread.php?t=15240)

Vadimich 04.08.2011 10:20

С++ и Блитц Параллели
 
Добрый день!
я работал на Blitz3d, а теперь начал изучать С++ и наверное, как и у большинства новичков, много глупых вопросов :)
Насколько я понял, классы в С++ это тоже, что и Типы в ББ. Как мне реализовать следующие моменты на С++, которые в ББ я бы написал так:

---------------------------
o.Object = New Object // создание одного нового экземляра
// допустим, что Тип (Класс) Object был объявлен где-то выше :)
---------------------------
for o.Object = each Object // перебор всех экземпляров 'o' типа Object
// some code
next
---------------------------
// ну и удаление экземпляра
Delete o

Спасибо. буду рад помощи ))

Morganolla 04.08.2011 10:36

Ответ: С++ и Блитц Параллели
 
1. - в С++ тоже есть оператор new.
2. - здесь тебе нужно будет самому либо :
а)сделать массив объектов
б) использовать библиотеку STL (списки или динамические массивы, с итераторами)
в) сделать простейший класс списка с контейнерами.
3. - в С++ тоже есть оператор delete
удачи!

Vadimich 04.08.2011 10:43

Ответ: С++ и Блитц Параллели
 
Дело в том, что учебник я ещё не дочитал. про то что есть new и delete мне известно.. видел, как они подсвечиваются при вводе.. мне интересно, как их использовать в данном случае. может напишешь небольшой примерчик?
массив объектов в данном случае не то... он ведь сразу создает определенное количество экземпляров, а не добавляет новые по необходимости (если я правильно понял эту часть)

SBJoker 04.08.2011 10:44

Ответ: С++ и Блитц Параллели
 
Код:

Object * o = new Object(); // создание одного нового экземляра

// ну и удаление экземпляра
delete(o);
o = 0;

А для перебора нужно сначала создать список и добавить туда элемент.

std::list<Object*> ObjectsList;

ObjectsList.push_back(o);

//перебор
std::list<Object*>::iterator itr;
for (itr = ObjectsList.begin(); itr != ObjectsList.end(); itr++) {
    //some code (*itr) - is element, access by (*itr)->
}

Однако стоит сначала почитать про память в C++. Так как даже этот неполный код таит в себе подводные камни.
Эффективное и безошибочное программирование на с++ без понимания основ управления памятью и механизма указателей невозможно.

Vadimich 04.08.2011 10:49

Ответ: С++ и Блитц Параллели
 
2 SBJoker: большое спасибо!

impersonalis 04.08.2011 12:31

Ответ: С++ и Блитц Параллели
 
Согласен с ДЖокером, от себя ещё добавлю:
В данном случае, не помешает изобрести пару велосипедов. Это позволит понять необходимость и рациональность тех или иных решений в готовых библиотеках.

Morganolla 04.08.2011 19:47

Ответ: С++ и Блитц Параллели
 
Цитата:

Сообщение от Vadimich (Сообщение 197945)
Дело в том, что учебник я ещё не дочитал.

Ничто не мешает использовать учебник как справочник с примерами.
Именно я так и делал - пробежал за недельку весь курс С++. Уяснил всю картину в целом. А потом внимательно изучал нужные разделы по мере необходимости. Кстати какой у тебя учебник?

Джокер, конечно, дал тебе шпаргалку, но чтобы осознано это использовать в полном объеме, придется попотеть дружочек )))

Черный крыс 05.08.2011 22:18

Ответ: С++ и Блитц Параллели
 
Лучше познай как устроен БМакса, с него прыгнуть будет проще

Vadimich 08.08.2011 12:23

Ответ: С++ и Блитц Параллели
 
конечно надо понять, как работает какой-то код, перед его бездумным использованием... у меня руководство для чайника.. Стефана Дэвиса.. я подозреваю, что он уже устарел, но думаю, что полезно будет сначала проглотить это... а после, усвоив базу, переходить к следующим.

HolyDel 09.08.2011 00:07

Ответ: С++ и Блитц Параллели
 
мой любимый цикл:
Код:

for(auto ci = somelist.begin(), ei = somelist.end();ci!=ei;++ci)
{
(*ci)->Some(some,some,some);
}


.Squid 09.08.2011 01:03

Ответ: С++ и Блитц Параллели
 
Ты уже на C++0x пишешь?

Mr_F_ 09.08.2011 13:23

Ответ: С++ и Блитц Параллели
 

Цитата:

мой любимый цикл:
никогда не запомню эту мутотень с итераторами.
по мне так for(int i=0;i<somelist.size();i++) куда интуитивнее.

.Squid 09.08.2011 13:26

Ответ: С++ и Блитц Параллели
 
Цитата:

Сообщение от Mr_F_ (Сообщение 198489)
никогда не запомню эту мутотень с итераторами.
по мне так for(int i=0;i<somelist.size();i++) куда интуитивнее.

Желаю удачи в удалении какого-то элемента из середины списка в таком цикле.

Mr_F_ 09.08.2011 13:49

Ответ: С++ и Блитц Параллели
 

Цитата:

Желаю удачи в удалении какого-то элемента из середины списка в таком цикле.
somelist.erase(somelist.begin()+i);
i--;

.Squid 09.08.2011 13:54

Ответ: С++ и Блитц Параллели
 
Цитата:

Сообщение от Mr_F_ (Сообщение 198496)

somelist.erase(somelist.begin()+i);
i--;



Vadimich 11.08.2011 09:40

Ответ: С++ и Блитц Параллели
 
вроде разобрался со связанным списком и его перебором.. но не могу быть до конца уверен, корректно ли я удаляю объект класса.. не остается ли мусора в памяти после этого. ведь 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;
}

.Squid 11.08.2011 13:08

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

Vadimich 11.08.2011 13:28

Ответ: С++ и Блитц Параллели
 
причина городить свои велосипеды - это понимать, как работают те или другие вещи...
хорошая практика по работе с указателями.
если всё таки допустить, что вышеописанная корявость имеет право на существование, то как бы удалил выбранный объект ты? если не трудно, опиши подробнее, пожалуйста... цель ведь научиться :)

.Squid 11.08.2011 14:10

Ответ: С++ и Блитц Параллели
 
Код:

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.
ЗЗЫ. Ты что, действительно, пишешь с таким форматированием (точнее, без него)?!

Vadimich 11.08.2011 14:12

Ответ: С++ и Блитц Параллели
 
спасибо .Squid

Vadimich 11.08.2011 14:21

Ответ: С++ и Блитц Параллели
 
ЗЗЫ: да не.. просто так вставилось )


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot