Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C++ (pointry)

Zdravím,
Už zase jsem se zamotal do pointrů v c++. Potřeboval bych poradit, jak by šel udělat vektor, který obsahuje nějaké uzly. Potom vytáhnu ukazatel na uzel ve vektoru a přiřadím jej jiném objektu.
Příklad:

vector<Node> vNode = vector<Node>(0);
Game game = Game(s,&Coord(r-1,p-1));
Node n = Node(game);
vNode.push_back(n);

addGames(vNode[0].getGame().dalsiTah(),&vNode,&vNo de[0]);
...

int addGames(vector<vector<Game> > game, vector<Node>* tr,Node* parent)
{
  tr->push_back(Node(game[i][j],parent));
  return 0;
}

objekt Node by si potom měl držet v privátní proměnné ukazatel na parent. Avšak tomu tak není :(. Když jsem metodu addgames volal

addGames(vNode[0].getGame().dalsiTah(),&vNode,&n);  // už ne přes vector, ale přímo ukazatel na Node (poslední parametr)

tak vše fungovalo podle očekávání. Vzhledem k tomu, že Nodeů mám velké množství, navíc se generují při běhu, tak nemůžu problém obejít podle 2. postupu. Potřebuji to udělat nějak přes ten vector nebo tomu podobně.

Díky za radu
Petr

Předmět Autor Datum
To neni otazka o pointroch ale o vectoroch a STL. A o tom ze preco nemas datovy navrh hotovy predtym…
MM.. 08.04.2011 00:25
MM..
Myslim ze &vNode a &vNode[0] je to same. Nie som si zhlavy isty nechce sa mi studovat STL (studuj ty…
MM.. 08.04.2011 00:28
MM..
parent je název promenne. Jedná se o stromovou strukturu a potřebuji se zpětně z node dostat k rootu…
.Petr. 08.04.2011 00:36
.Petr.
Aha uz to chapem co chces a potesim ta - to sa takto neda :-) Moj nazor. Preco: lebo vektor je niec…
MM.. 08.04.2011 00:36
MM..
Este preistotu ta upozornim aj na jednu vec neviem ci vies: lokalne (deklarovane vnutri funkcie a ne…
MM.. 08.04.2011 00:49
MM..
Este posledne info :) To co chces asi nakoniec dosiahnut sa vola datova struktura strom (tree) http:… poslední
MM.. 08.04.2011 00:57
MM..

parent je název promenne. Jedná se o stromovou strukturu a potřebuji se zpětně z node dostat k rootu. Naopak je mi to k ničemu, tak jsem si řekl, že každý node bude držet referenci na parent. jinak rozdíl mezi &vNode a &vNode[0] je v tom, že &vNode je vector<Node> a &vNode[0] je Node na pozici 0. Podobně jako u pole.

Aha uz to chapem co chces a potesim ta - to sa takto neda :-) Moj nazor.

Preco: lebo vektor je nieco ako dynamicke pole. A nemozes drzat pointre na prvky dynamickeho pola pretoze dynamicke sa moze kedykolvek realokovat (to znamena zmeni sa adresa celeho pola). Ani to samotne &vector[0] ti asi neda adresu prvku 0, ale len nejaku haluz adresu do stacku.
Predavaj poradove cislo toho parent prvku a pristupuj na to pomocou [cislo] a nie ako pointer. Proste mozes (resp. musis) pouzivat na pristup k prvkom len to co ti poskytuje ta trieda vector viz napr. vector a pracu s adresami musis prenechat tej triede, ptz adresy su dynamicke (to je prave predsa zmysel tej triedy ze robi dynamicke pole t.j. stara sa o alokaciu a realokaciu a teda momentalne platne adresy su len v jej privatnych premennych)

Este preistotu ta upozornim aj na jednu vec neviem ci vies:
lokalne (deklarovane vnutri funkcie a ne static) premenne su len v zasobniku a po skonceni funkcie prestavaju byt platne, ak si niekam ulozis ukazatel na takuto premennu tak po skonceni funkcie bude ukazovat na nezmysel (nahodne tam moze byt este nejaky cas spravna vec ale potom zrasu raz sa prepise niecim inym). To je dost blba chyba ptz ti to compiler ani linker neindikuje, takze aj na to pozor (to si sa snazil robit v tom druhom spososobe a to bolo tiez tak trochu zle aj ked ti to fungovalo v jednoduchom teste ale nebude to fungovat v komplikovanom programe).

Idealne je vyhybat sa ukazatelom kde to len ide. Napr. ten kontajner "vector" uz ti poskytuje uplne vsetko na to aby si vobec nepouzival ukazatele :)

Zpět do poradny Odpovědět na původní otázku Nahoru