Wie kann ich eine Klasse verwenden, bevor ich sie definiere?

7
%Vor%

%Vor%

Wie kann ich das in C ++ machen? Es funktioniert in C #.

BEARBEITEN:

Warum Node* previous funktioniert?

    
Pratik Deoghare 25.05.2010, 13:04
quelle

6 Antworten

10

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.

    
Costantino Rupert 25.05.2010, 13:05
quelle
8

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.

    
Uri 25.05.2010 13:05
quelle
5

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.

    
Naveen 25.05.2010 13:12
quelle
2

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.

    
Steve Jessop 25.05.2010 13:09
quelle
2

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.

    
franji1 26.05.2010 02:18
quelle
1

Sollte Knoten nicht ein Zeiger sein?

    
illuzive 25.05.2010 13:05
quelle

Tags und Links