2016-04-26 31 views
2

Ich versuche, einen Zeiger auf eine Klasse wie folgt zu erstellen.C++ ein Objekt einer anderen Klasse zuweisen

ASTNode* pAssign = new ASTAssignmentNode(); 

jedoch pAssign besteht nicht aus den in der Klasse definierten Variablen ASTAssignmentNode. Verpasse ich hier etwas? Wie kann ich auf die in ASTAssignmentNode() definierten Variablen zugreifen? ASTAssignmentNode() erbt von , die von ASTNode() erbt.

Wenn pAssign->variable Schreiben (die in ASTAssignmentNode()) deklariert ist ein Fehler aufgetreten "PDem enthält keine Definition für Membervariable"

Ich bin nicht in C erfahren ++.

jede mögliche Hilfe schätzen würde.

+1

Weisen Sie es dem Zeiger auf 'ASTAssignmentNode' zu. –

+2

Wenn Sie 'ASTAssignmentNode' verwenden möchten, warum haben Sie einen Zeiger auf die Basisklasse? –

Antwort

1

Sie sollten stattdessen ASTAssignmentNode * pAssign verwenden.Wenn Sie dies für eine Klassenzuweisung tun und sie Ihnen Dateien geben, die Sie nicht modifizieren sollen und die Sie ASTNode * verwenden lassen, fragen Sie Ihren TA darüber, weil ich in dieser Situation war und es sollte Workarounds geben, die Sie verwenden können, aber es wi Sie unterscheiden sich von den verschiedenen Aufgaben.

+0

Vielen Dank für das Verständnis meiner Situation. Ich werde es entsprechend prüfen. – Techworld

1

Try Casting Variablen zuzugreifen zu ASTAssignmentNode Klasse gehören

((ASTAssignmentNode* ) pAssign)->variable 

Was habe ich für eine Einzel Besetzung genannt wird. Sie können auch die statische Besetzung oder die dynamische Besetzung verwenden, die von M.M. Wenn Sie eine genaue Aufschlüsselung der Art von Besetzung benötigen Sie, überprüfen Sie eine post here.

Solange Sie sicher sind, dass ASTAssignmentNode ein Kind von ASTNode ist, sollte dies keine Auswirkungen haben.

Wenn Sie ASTAssignmentNode zu ASTNode konvertieren, enthält es nur die Klassendefinition für ASTNode und es weiß nichts über ASTAssignmentNode. Deshalb musst du es zurückwerfen.

Eine Ausnahme sind virtuelle Funktionen. Virtuelle Funktionen rufen die Implementierung der Kindklasse auf, wenn sie existiert.

+0

Das hat funktioniert. Können Sie mir bitte erklären, ob es Auswirkungen haben könnte, wenn ich das nutze? – Techworld

+0

Dies sollte 'dynamic_cast' oder' static_cast' sein (vorzugsweise ersteres, es sei denn, Sie wissen wirklich, was Sie tun) –

+0

Bearbeitet, um eine kurze Erklärung zu enthalten – Striker

0

Da pAssign ein Zeiger auf die Basisklasse ist, müssen Sie es in die abgeleitete Klasse ASTAssignmentNode umwandeln. Vorzugsweise mit einem C++ Dynamic_cast.

dynamic_cast<ASTAssignmentNode*>(pAssign)->variable 
+0

Danke, das hat sehr geholfen! :) – Techworld

+0

Wenn Sie dynamic_cast für jemanden einführen, weisen Sie darauf hin, dass es null zurückgeben kann – kfsone

Verwandte Themen