Verkettung von Methoden hat nicht das selbe Ergebnis wie 2* die Methode???



  • class iterator
    {
        //...
        virtual iterator go_left()
        {
            if(now&&now->lnode)
            {
                now=now->lnode;
                return *this;
            }
            else
                throw std::out_of_range("Linker Knoten nicht ist gesetzt!");
        };
        //...
    };
    

    Wenn ich jetz

    a.go_left();
    a.go_left();
    

    schreibe, klappt alles wunderbar. Aber bei

    a.go_left().go_left();
    

    läuft er mir irgendwohin, aber nicht so wie gedacht. Warum?
    Achja, ich versuche grade einen Iterator für einen selbst-geschriebenen binären Baum zu coden...



  • virtual iterator go_left()

    Das liefert eine Kopie deines Iterators.
    Mach daraus ein

    virtual iterator & go_left()



  • Ponto schrieb:

    virtual iterator go_left()

    Das liefert eine Kopie deines Iterators.
    Mach daraus ein

    virtual iterator & go_left()

    Ne, die stl liefert auch immer kopien des Iterators. Ich wollte nur wissen warum das net so geht wie ich dachte.



  • @ness
    doch das liegt schon daran, dass du eine Kopie zurückgibst.

    a.go_left().go_left(); //ist gleich
    
    {
      iterator tmp=a.go_left();
      tmp.go_left();
    }
    


  • ness schrieb:

    Ponto schrieb:

    virtual iterator go_left()

    Das liefert eine Kopie deines Iterators.
    Mach daraus ein

    virtual iterator & go_left()

    Ne, die stl liefert auch immer kopien des Iterators. Ich wollte nur wissen warum das net so geht wie ich dachte.

    Dann wird aber das zweite go_left() auf der Kopie ausgeführt. Diese Kopie wird dann wieder weggeworfen, da sie nicht benutzt wird. Auf a hat das überhaupt keinen Effekt.



  • Ja, das ist mir klar. In der stl ist das genauso, also halte ich mich am besten daran. Eigentlich hatte ich solche Verkettungen gar nicht vor, aber dann hats mich gewundert warum da was nicht geht. Aber, eigentlich klar.



  • ness schrieb:

    Ja, das ist mir klar. In der stl ist das genauso, also halte ich mich am besten daran. Eigentlich hatte ich solche Verkettungen gar nicht vor, aber dann hats mich gewundert warum da was nicht geht. Aber, eigentlich klar.

    Hast du mal ein Beispiel, wo es die STL genauso macht?



  • Wie wärs mit merge?



  • ness schrieb:

    Wie wärs mit merge?

    Das ist ja ein Algorithmus, der einen Iterator zurückgibt. Da ist klar, dass dies nicht per Referenz geschieht. Dein go_left() ist aber eine Methode des Iterators. Das kann man nicht vergleichen. Ich würde da eine Referenz auf *this zurückgeben.



  • Ponto schrieb:

    Das ist ja ein Algorithmus, der einen Iterator zurückgibt. Da ist klar, dass dies nicht per Referenz geschieht. Dein go_left() ist aber eine Methode des Iterators. Das kann man nicht vergleichen. Ich würde da eine Referenz auf *this zurückgeben.

    Na dann werde ich mal auf dich hören,...


Anmelden zum Antworten