2017-12-06 3 views
0

Ich habe eine Aufgabe, ein Objekt Stos zu schaffen, die einen Haufen von Objekten Obiekt verfügen würden, auf denen ich Dinge hinzufügen könnte, wie ich will.Vektor von Objektzeiger gibt ungeradee Werte

Um das Programm besser dynamische Arrays zu unterstützen, entschied ich mich für einen Vector. Die gesamte Implementierung scheint perfekt zu laufen, der zurückgegebene Wert ist komplett aus. Hier ist ein Beispiel mit Code:

class Obiekt { 
private: 
    int id; 

public: 
    Obiekt::Obiekt(int i) { 
     id = i; 
    } 

    void Obiekt::display() { 
     cout << "This object has id of: " << id << endl; 
    } 
}; 

class Stos { 
private: 
    vector < Obiekt* > stos; 
public: 
    Stos::Stos(Obiekt n) { 
     add(n); 
    } 

    void Stos::add(Obiekt n) { 
     stos.push_back(&n); 
    } 

    void Stos::display() { 
     cout << endl << "===HEAP DISPLAY===" << endl; 
     for (int i = 0; i < stos.size(); i++) { 
      stos[i]->display(); 
     } 
    } 
}; 

void Zad1() 
{ 
    Obiekt obj1(5); 
    Obiekt obj2(23); 

    Stos s1(obj1); 
    s1.add(obj2); 
    s1.display(); 

    getchar(); 
} 

Und das Ergebnis Wesen:

=== HEAP DISPLAY ===

Dieses Objekt hat id: -858993460

Dieses Objekt hat eine ID von: 9805925

Ich bin kein cpp Experte, und glaube, das Problem ist mit dem stos.push_back(&n) Teil verbunden, aber ich kann nicht den Moment fangen die ID wird so verzerrt.

Es ist wahrscheinlich eine noob Frage, so leid für den Start.

Jede Hilfe wäre erstaunlich.

+0

@ O'Neil Arbeitete !! Vielen Dank. Könnten Sie das als Antwort posten? – aln447

+0

Antwort geschrieben :) –

+0

Die einfachste Lösung ist, den Vektor zu machen 'vector < Obiekt > stos;' –

Antwort

1

Die Parameter Obiekt n in

Stos::Stos(Obiekt n) { 
    add(n); 
} 

void Stos::add(Obiekt n) { 
    stos.push_back(&n); 
} 

sind temporäre Kopien nach jedem Anruf zerstört sofort.

Sie müssen stattdessen eine Referenz Obiekt & n verwenden, oder besser: mit Zeiger Obiekt * n.

+3

Es ist üblich, dass, wenn ein Parameter als Referenz übergeben wird, sollte seine Adresse nicht hinter dem Anruf gespeichert werden, so ist dies nicht gut Stil –

3

Das Problem mit Ihrem Code wie O'Neil korrekt erklärt ist, dass Sie den Zeiger auf eine Kopie des Obiekt-Objekts hinzufügen. Im Grunde erstellen Sie Ihr Objekt in main und übergeben es an den Konstruktor und die .add-Funktion in Stos. Sie fügen dann den Vektor Zeiger zu dem Vektor hinzu. Wenn die Funktion beendet ist, wird die Kopie, die übergeben wurde, zerstört, und der Zeiger in Ihrem Vektor bleibt hängen. Es gibt zwei Möglichkeiten, dieses Problem zu beheben:

1 Pass von Referenz

Dies ist sehr einfach, im Grunde einfach ein kaufmännische auf Ihre Funktionsparameter hinzuzufügen. Zum Beispiel:

void Stos::add(Obiekt &n) { 
    stos.push_back(&n); 
} 

Dadurch wird sichergestellt, dass das Objekt nicht am Ende der Funktion zerstört wird

2 Verwenden Sie keine Zeiger

Eine andere Möglichkeit, das Problem an der Arbeit zu Vermeiden Sie es überhaupt, Zeiger zu verwenden. Ihr Vektor wird den Inhalt des Obiekt-Objekts tatsächlich in ihn kopieren. Zum Beispiel:

vector <Obiekt> stos; // notice how we define it without the pointer type 

...

+0

Aufgabe Anforderung war Damit das Array vom Klassenzeigertyp ist – aln447

+0

Gotcha. M.M ist jedoch richtig, Sie sollten nach Zeiger-Wert statt durch Referenz übergeben –

0

Ich bin widerwillig zu behaupten, dass die Objekte zum Zeitpunkt der Anzeige vorhanden sind.

Problem (e)

Nach Durchführung des GCC sie es nicht tun. Sie fallen aus dem Rahmen und werden sofort zerstört. Geben Sie „Obiekt“ einen nicht-trivialen destructor und dieses Verhalten wird deutlich:

~Obiekt(){std::cout << "Bye from: " << it << std::endl;} 

Zweitens ist zu beachten, dass Sie nicht die Klassenzugehörigkeit für Funktionen definiert, innerhalb der Klasse selbst (keine class_name :: function_name (Parameter) angeben sollen nur function_name (Parameter))

Mögliche Fix

Sie (vielleicht) an sich ändernde "Stos" wollen, so dass:

Stos(Obiekt &n) {add(n);} 
void add(Obiekt &n) {stos.push_back(&n);} 
Verwandte Themen