![]() |
С++ и Блитц Параллели
Добрый день!
я работал на Blitz3d, а теперь начал изучать С++ и наверное, как и у большинства новичков, много глупых вопросов :) Насколько я понял, классы в С++ это тоже, что и Типы в ББ. Как мне реализовать следующие моменты на С++, которые в ББ я бы написал так: --------------------------- o.Object = New Object // создание одного нового экземляра // допустим, что Тип (Класс) Object был объявлен где-то выше :) --------------------------- for o.Object = each Object // перебор всех экземпляров 'o' типа Object // some code next --------------------------- // ну и удаление экземпляра Delete o Спасибо. буду рад помощи )) |
Ответ: С++ и Блитц Параллели
1. - в С++ тоже есть оператор new.
2. - здесь тебе нужно будет самому либо : а)сделать массив объектов б) использовать библиотеку STL (списки или динамические массивы, с итераторами) в) сделать простейший класс списка с контейнерами. 3. - в С++ тоже есть оператор delete удачи! |
Ответ: С++ и Блитц Параллели
Дело в том, что учебник я ещё не дочитал. про то что есть new и delete мне известно.. видел, как они подсвечиваются при вводе.. мне интересно, как их использовать в данном случае. может напишешь небольшой примерчик?
массив объектов в данном случае не то... он ведь сразу создает определенное количество экземпляров, а не добавляет новые по необходимости (если я правильно понял эту часть) |
Ответ: С++ и Блитц Параллели
Код:
Object * o = new Object(); // создание одного нового экземляра Эффективное и безошибочное программирование на с++ без понимания основ управления памятью и механизма указателей невозможно. |
Ответ: С++ и Блитц Параллели
2 SBJoker: большое спасибо!
|
Ответ: С++ и Блитц Параллели
Согласен с ДЖокером, от себя ещё добавлю:
В данном случае, не помешает изобрести пару велосипедов. Это позволит понять необходимость и рациональность тех или иных решений в готовых библиотеках. |
Ответ: С++ и Блитц Параллели
Цитата:
Именно я так и делал - пробежал за недельку весь курс С++. Уяснил всю картину в целом. А потом внимательно изучал нужные разделы по мере необходимости. Кстати какой у тебя учебник? Джокер, конечно, дал тебе шпаргалку, но чтобы осознано это использовать в полном объеме, придется попотеть дружочек ))) |
Ответ: С++ и Блитц Параллели
Лучше познай как устроен БМакса, с него прыгнуть будет проще
|
Ответ: С++ и Блитц Параллели
конечно надо понять, как работает какой-то код, перед его бездумным использованием... у меня руководство для чайника.. Стефана Дэвиса.. я подозреваю, что он уже устарел, но думаю, что полезно будет сначала проглотить это... а после, усвоив базу, переходить к следующим.
|
Ответ: С++ и Блитц Параллели
мой любимый цикл:
Код:
for(auto ci = somelist.begin(), ei = somelist.end();ci!=ei;++ci) |
Ответ: С++ и Блитц Параллели
|
Ответ: С++ и Блитц Параллели
|
Ответ: С++ и Блитц Параллели
|
Ответ: С++ и Блитц Параллели
|
Ответ: С++ и Блитц Параллели
|
Ответ: С++ и Блитц Параллели
вроде разобрался со связанным списком и его перебором.. но не могу быть до конца уверен, корректно ли я удаляю объект класса.. не остается ли мусора в памяти после этого. ведь 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, время: 10:13. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot