%Vor%
Wie kann ich das in C ++ machen? Es funktioniert in C #.
BEARBEITEN:
Warum Node* previous
funktioniert?
Benutze Zeiger. Node* previous;
würde das Problem lösen.
Wenn Sie es jetzt tun, versuchen Sie tatsächlich, Ihre Klasse unendlich groß zu machen.
Verwenden Sie einen Zeiger oder eine Referenz.
Zum Beispiel:
%Vor%Die einzige Einschränkung ist, dass eine Klasse kein eigenes Feld haben kann, wahrscheinlich aus Konstruktionsgründen. Denken Sie darüber nach, wenn jede Box eine andere Box enthält, wie würden Sie dann mit einer endlichen Anzahl von Boxen enden?
Wenn ich mich nicht irre, verwendet C # nur Verweise auf Klassen (wie auch Java), Sie verwenden also einen Verweis, den Sie nicht sehen.
Denken Sie bei der Bearbeitung daran, dass Ihre node
eine weitere node
enthält, die eine weitere darin enthält. Sie haben also eine unendliche Folge von Knoten, die ineinander enthalten sind. Was Sie wollen, ist ein Zeiger auf den Ort, an dem der nächste node
gespeichert ist. Sie sollten es also in Node*
ändern.
Wenn Sie in C # previous
angeben, erhalten Sie eine Referenz. In C ++ deklariert previous
wie folgt ein Objekt, das in jedes Objekt der Klasse Node
eingebettet ist.
Ein Objekt kann nicht rekursiv ein Objekt derselben Klasse enthalten. previous.name
müsste existieren (und Speicherplatz zugewiesen haben), ebenso wie previous.previous.name
usw. unendlich in einer einzigen Speicherzuweisung. Die Größe eines Node
-Objekts müsste mindestens so groß sein wie die Größe eines string
-Objekts plus der Größe eines Node
-Objekts (was unmöglich ist, da string
mehr als 0 Bytes ist). Und andere solche Widersprüche.
Wie andere sagen, verwenden Sie einen Zeiger: Node *previous
oder eine Referenz Node &previous
. Oder ein std::deque<std::string>
; -)
Vielleicht möchten Sie wissen, dass sich C ++ auf andere Weise von C # unterscheidet, was Ihren Tag verderben wird, wenn Sie versuchen, eine einfach verknüpfte Liste durch Portieren von C # -Code zu schreiben. Zum Beispiel keine Garbage Collection. Sie können den richtigen C ++ - Code nicht schreiben, ohne das C ++ - Objektmodell zu verstehen.
Denken Sie an ein Auto-Objekt "in der realen Welt". Es kann über die Fahrgestellnummer eine Referenz auf ein anderes Fahrzeugobjekt enthalten. Es könnte sogar einen Verweis auf sich selbst oder auf den VIN-Wert von 0 (NULL oder NO CAR) enthalten.
Aber was, wenn Sie buchstäblich ein anderes OBJEKT in jedem Autoobjekt haben wollten? Wie würde das funktionieren? Welches Car-Objekt würde das enthaltene Car-Objekt enthalten?
Java und C # platzieren das OBJEKT nicht wirklich in der enthaltenen Klasse, sondern als REFERENCE auf das Objekt. Mit Sprachen wie C ++ können Sie angeben, ob in der Klasse ein OBJECT enthalten ist, eine REFERENCE auf ein anderes in der Klasse enthaltenes OBJECT oder sogar ein POINTER auf ein anderes in der Klasse enthaltenes OBJECT:
%Vor%Schließlich werden Sie zu dem Punkt kommen, an dem Sie wissen, wann und warum Sie den ersten, den zweiten oder den dritten verwenden sollten, aber das ist eine ganz andere Frage.