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=18716)

St_AnGer 15.11.2013 15:55

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

Классы 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*>), но становилось ещё хуже, потому что я банально не понимаю как тогда по этому массиву пробежаться в цикле.

Knightmare 15.11.2013 16:04

Ответ: Проблема с указателями
 
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();


St_AnGer 15.11.2013 16:21

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

и с циклом всё просто оказалось, а я голову ломал:
Код:

for (vector<cGeom*>::iterator i = this->geoms.begin(); i != this->geoms.end(); i++)
{
        if (1)
                (*i)->render();
}


Samodelkin 15.11.2013 18:04

Ответ: Проблема с указателями
 
Цитата:

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

и с циклом всё просто оказалось, а я голову ломал:
Код:

for (vector<cGeom*>::iterator i = this->geoms.begin(); i != this->geoms.end(); i++)
{
        if (1)
                (*i)->render();
}


Это кстати можно сократить, если с++11, до:
Код:

for ( auto ptr : geoms ) {
    ptr->render();
}

Просто чтобы короче запись была.


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

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