2017-06-22 13 views
2
list_sorter add(std::list<typeOfList> &list){ 
    list_num++; 
    lp.insert(lp.end(), list.begin(), list.end()); 
    lp.sort(); 
    list.clear(); 
    std::cout << list_num << std::endl; 
    return *this;} 

Ich habe diese kleine Methode in einer Klasse-Vorlage aufrufen, in der Hauptsache ich es so nennen:eine Methode für ein Verfahren C++

si.add(lc).add(lb); 

beide Male ausgeführt bekommt, Couts es eine erhöhte list_num, aber nach dem zweiten add() wird es nicht gespeichert. Warum das?

+0

Ändern der Rückgabetyp von 'list_sort' zu' list_sort & ' – Amadeus

+0

Schritt durch in Ihrem Debugger und sehen, was' this' ist. Als Anmerkung wird dieser Stil mit 'x(). Y(). Z()' "Verketten" genannt. – tadman

Antwort

2

add gibt nach Wert zurück, dh es wird ein neues temporäres list_sorter von *this kopiert zurückgegeben, und das temporäre hat nichts mit dem ursprünglichen Objekt zu tun.

Sie können es ändern, um durch Referenz zurückzukehren. d.h.

list_sorter& add(std::list<typeOfList> &list){ 
    list_num++; 
    lp.insert(lp.end(), list.begin(), list.end()); 
    lp.sort(); 
    list.clear(); 
    std::cout << list_num << std::endl; 
    return *this; 
} 
+0

Danke! Nun, das war einfach. Ich hätte wissen müssen, ich bin neu in C++, es braucht Zeit, um sich an Referenzen/Zeiger zu gewöhnen. – Shaq

0
list_sorter add(std::list<typeOfList> &list) { 
    ... 
    return *this; 
} 

Da diese Funktion einen Wert und keine Referenz gibt, ändert es das Objekt, kehrt dann eine Kopie des Objekts. Der nachfolgende Aufruf erfolgt auf der Kopie. Danach wird diese Kopie zerstört, da Sie sie nie einer Variablen zugewiesen haben.

Lösung ist:

list_sorter& add(std::list<typeOfList> &list) 
     ^
+0

Danke! Referenzen/Hinweise täuschen mich immer. Ich werde nächstes Mal vorsichtiger sein. – Shaq

Verwandte Themen