2016-03-26 5 views
2

Ich versuche Stacks mit Konstruktoren in C++ zu implementieren. Ich muss eine externe Funktion verwenden, um ein Element auf den Stapel zu schieben, aber es scheint nicht richtig zu funktionieren. Die pushexternale Funktion scheint die Push-Funktion zu "betreten", erhöht aber nicht den ind-Wert, daher fügt sie dem Stack kein neues Element hinzu (zum Beispiel versuchen in meinem Code alle Pushxternals einen Wert auf zu schieben) derselbe Index, der letzte von s.push - ind == 2). Ich bin mir nicht sicher, was ich falsch mache.Stack Push mit externer Funktion

Oh, ich soll nur den Klassencode ändern - die Pushexternal und Main müssen unverändert bleiben.

#include <iostream> 
using namespace std; 

class Stack { 
    public: 
    int ind; 
    int * arr; 

Stack() 
{ 
    arr = new int[25]; 
    ind = -1; 
} 
~Stack() 
{ 
    delete [] arr; 
} 

void push(int val) 
{ 
    arr[++ind] = val; 
    cout << "Added " << arr[ind] << " to " << ind << endl; 
} 

void top() 
{ 
    cout << "Last: " << arr[ind]; 
} 
}; 

void pushexternal(Stack s, int a) { 
    s.push(a); 
} 

int main() { 
    Stack s; 
    s.push(0); 
    s.push(1); 
    s.push(2); 
    pushexternal(s, 3); 
    pushexternal(s, 4); 
    pushexternal(s, 5); 
    return 0; 
} 

Ergebnisse:

Added 0 to 0 
Added 1 to 1 
Added 2 to 2 
Added 3 to 3 
Added 4 to 3 
Added 5 to 3 
Top: 2 

Antwort

2
void pushexternal(Stack s, int a) { 
    s.push(a); 
} 

einen Stapel als Parameter erhält, was bedeutet es, ein Objekt empfängt, die eine Kopie des Objekts ist.

Sie sollten auf Referenzen arbeiten, auf diese Weise werden Sie keine Kopie des zu manipulierenden Objekts senden, aber die Referenz des Objekts, also das ursprüngliche Objekt wird manipuliert werden.

+0

Vielen Dank, die Weitergabe funktioniert einwandfrei. Allerdings muss ich die pushexternale Funktion ändern (void pushexternal (Stack & s, int a)). In dieser Aufgabe möchte ich, dass das Buch die pushexternalen und Hauptfunktionen unverändert lässt und nur den Code meiner Klasse ändert. Ich bin mir nicht sicher, wie ich es noch nicht ausprobiert habe, aber würde ich in diesem Fall eine Kopierhilfe verwenden? – drakerc

+0

Ein Kopierkonstruktor wird verwendet, um ein Objekt mit Daten von einem bereits vorhandenen Objekt zu initialisieren. Das würde Ihnen nicht helfen, da Ihre Funktion Stack vom Funktionsparameter übernimmt und darauf operiert. Ich schätze, das Beispiel ist entweder falsch oder das Buch möchte, dass Sie den "Fehler" finden. – Aleksandar

1
void pushexternal(Stack s, int a) { 
    s.push(a); 
} 

Sie passieren die Stack Objekt auf diese Funktion von Wert, nicht Bezug genommen wird. Dadurch wird eine temporäre Kopie des ursprünglichen Objekts Stack erstellt, sodass das ursprüngliche Objekt unverändert bleibt. Nicht zu erwähnen, dass dies zu einer Speicherbeschädigung führt, da das RAII Prinzip verletzt wurde.

Nur durch das Glück der Verlosung, ich denke, Ihr Code ist nicht segfauling.