C++, iets over pointers en parameters.

Laatst was ik een binaire zoekboom aan het maken in C++. Zoals iedere boom begint met een wortel, begint mijn boom ook met een wortel.

struct element<T> *root;

Een pointer dus naar het root element. Nu had ik een add(T value) functie die een nieuwe element gaat toevoegen aan de boom. In die functie staat één regel namelijk.

addNode(root, value);

Nu had ik als volgt de definitie gemaakt voor de addNode functie.

void addNode(struct element<T> *branch, T value)

In de functie ga ik recursief de boom doorzoeken naar een plekje voor het nieuwe element en in die functie wijzig ik branch. Nu gaat dit niet zomaar dat wijzigen omdat ik eigenlijk het adres van de pointer meegeef. Dus ik gaf de pointer by-value door terwijl ik eigenlijk de pointer by-reference moest doorgeven. De compiler begon er al over te zagen maar op IRC zei een C++ guru dat dit by-reference moet doorgegeven worden als je dat wilt wijzigen. Dit ziet er als volgt uit.

void addNode(struct element<T> *&branch, T value)

Een alternatief is gebruik maken van dubbele pointers (dat is iets wat Rob zekers zal bekoren)

void addNode(struct element<T> **branch, T value)

Pointers, het is me wat… ^^

One Response to C++, iets over pointers en parameters.

  1. Rob zegt:

    Mijn add-methode had ik niet recursief gemaakt. Dus ik moest in die methode niet met dubbele pointers of by reference werken. Het is in de verwijder methode en de zoek methode dat ik met dubbele pointers werk.

    De docent heeft mij daarna wel een recursieve add methode gegeven. Die werkt recursief en by reference. Dit vond ze beter:

    template
    void binaireZoekboom::voegtoeRec(T x, element* &hulp)
    {
    if(hulp==NULL){
    hulp=new element(x);
    }else
    if(xwaarde){
    voegtoeRec(x, hulp->kleiner);
    }else{
    voegtoeRec(x, hulp->groter);
    }
    }

Geef een reactie

Vul je gegevens in of klik op een icoon om in te loggen.

WordPress.com logo

Je reageert onder je WordPress.com account. Log uit / Bijwerken )

Twitter-afbeelding

Je reageert onder je Twitter account. Log uit / Bijwerken )

Facebook foto

Je reageert onder je Facebook account. Log uit / Bijwerken )

Google+ photo

Je reageert onder je Google+ account. Log uit / Bijwerken )

Verbinden met %s

%d bloggers op de volgende wijze: