2016-11-05 1 views
-2
struct Node{ 
    int value; 
    Node *next; 
    Node(int val) :value(val), next(nullptr){} 
}; 
class Stack 
{ 
public: 
    void push(int val); 
    int pop(); 
    bool is_empty(){ return first == nullptr; } 
private: 
    Node *first = nullptr; 
}; 

int Stack::pop(){ 
    int ret = first->value; 
    first = first->next; 
    return ret; 
} 
void Stack::push(int i){ 
    if (is_empty()){ 
     first = &Node(i); 
     return; 
    } 
    Node oldFirst = *first; 
    first = &Node(i); 
    first->next = &oldFirst; 
} 

Hier ist, wie ich den Code geschrieben habe, gibt es jedoch ein Problem, dass, wenn ich push() den Zeiger von first abgeschlossen ist nicht auf das richtige Objekt zeigen. Ich frage mich, wie ich dieses Problem lösen kann.Wie man eine C++ Stapelstruktur baut

+2

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

'std :: stack ' –

Antwort

3

Der Ausdruck &Node(i) schafft ein temporäre Objekt und geben Ihnen einen Zeiger darauf. Und dann wird das temporäre Objekt sofort zerstört, und Sie erhalten einen Zeiger auf ein nicht existierendes Objekt.

Sie müssen new verwenden, um ein neues Objekt zuzuordnen.

Sie haben ein ähnliches Problem mit &oldFirst, die Ihnen einen Zeiger auf eine lokale Variable geben, die zerstört wird, sobald die Funktion zurückkehrt. Sie müssen eine Zeigervariable verwenden.