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

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

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

Ответ
 
Опции темы
Старый 15.11.2013, 15:55   #1
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Проблема с указателями

Доброго времени суток, Булчане!
Мне просто по-зарез нужна ваша помощь. Конечно, для гуру мой вопрос покажется банальным (наверно), но я не могу его решить. Вообщем вот что имею:

Классы cGeom и cGeomManager содержащий функцию и вектор:
class cGeom
{
...
}

class cGeomManager
{
...
    vector<cGeom> geoms;
    cGeom *createGeom();
...
}


cGeom *cGeomManager::createGeom()
{	
    this->geoms.push_back( cGeom() );
    return &this->geoms.back();
}
ну и далее это дело использую слудеющим образом:
cGeomManager* geom = new cGeomManager;
cGeom *geom1 = geom->createGeom();
cGeom *geom2 = geom->createGeom();
cGeom *geom3 = geom->createGeom();
И вот тут проблема. Когда я создаю первый объект(geom1) им можно управлять как угодно (т.е. использовать все функции и переменные этого объекта и т.д.). Но когда создаётся второй и последующие объекты - к созданным ранее доступ теряется(создался geom2 - geom1 больше для меня недоступен). Головой понимаю что наверное что-то происходит с указателем, а чего происходит и как это решить - не пойму.

Уже прочитал все ссылки в гугле по вопросам указателей - ответа не нашёл. Потому прошу помощи у знающих. И не пинайте за говнокод, пожалуйста

зыЖ пробовал делать массив указателей в классе cGeomManager (ну т.е. vector<cGeom*>), но становилось ещё хуже, потому что я банально не понимаю как тогда по этому массиву пробежаться в цикле.
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием
Старый 15.11.2013, 16:04   #2
Knightmare
Дэвелопер
 
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений
(для 2,920 пользователей)
Ответ: Проблема с указателями

push_back() приводит к переаллокации вектора, твои указатели после этого ссылаются на мусор в памяти.

- vector<cGeom> geoms;
+ vector<cGeom*> geoms;

- this->geoms.push_back( cGeom() );
- return &this->geoms.back();
+ this->geoms.push_back( new cGeom() );
+ return this->geoms.back();
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Knightmare за это полезное сообщение:
HolyDel (15.11.2013), St_AnGer (15.11.2013)
Старый 15.11.2013, 16:21   #3
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Ответ: Проблема с указателями

Просто наиогромнейшее спасибо тебе! Про переаллокацию усвоил.

и с циклом всё просто оказалось, а я голову ломал:
for (vector<cGeom*>::iterator i = this->geoms.begin(); i != this->geoms.end(); i++)
{
	if (1)
		(*i)->render();
}
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием
Старый 15.11.2013, 18:04   #4
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Проблема с указателями

Сообщение от St_AnGer Посмотреть сообщение
Просто наиогромнейшее спасибо тебе! Про переаллокацию усвоил.

и с циклом всё просто оказалось, а я голову ломал:
for (vector<cGeom*>::iterator i = this->geoms.begin(); i != this->geoms.end(); i++)
{
	if (1)
		(*i)->render();
}
Это кстати можно сократить, если с++11, до:
for ( auto ptr : geoms ) {
    ptr->render();
}
Просто чтобы короче запись была.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо Samodelkin за это полезное сообщение:
Кирпи4 (16.11.2013), HolyDel (15.11.2013), St_AnGer (15.11.2013)
Ответ


Опции темы

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

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


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


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