2016-10-09 1 views
0

Ich verwende die beiden folgenden Dateien für mein Projekt. Die Variable, die ich beziehe, Node parent, war ursprünglich kein Zeiger, aber ich fand schnell heraus, dass dies aus offensichtlichen Gründen (Speicher) nicht funktioniert.Wie behandelt man eine Variable mit dem gleichen Typ wie die Klasse, zu der sie gehört?

Also habe ich es in einen Zeiger verwandelt. Das Problem ist, dass parent scheint nicht richtig in meinem Code behandelt werden, so dass ich am Ende mit meiner Anwendung abstürzt, wenn ich eine Funktion wie getParent() ausführen. Welche Modifikationen würden dieses Problem beheben?

Node.h

#include <string> 
#include <vector> 
#include <iostream> 
#include "Action.h" 
class Node 
{ 

Node.cpp

#include "stdafx.h" 
+1

Für die Leistung sollten Sie 'std :: string title' in' const std :: string & title' ändern. –

+1

Sie müssen lernen, wie Parameter als Referenz übergeben werden. –

+0

Noch bessere Leistung ': title (Std :: move (Titel))' :) @EdHeal Ich denke nicht, dass dies einen Leistungsvorteil gibt, kann der Compiler nicht verschieben optimieren, und muss stattdessen eine Kopie machen. – Rakete1111

Antwort

0

sollten Sie überprüfen, ob Eltern null ist oder nicht, bevor defreferencing.

convert Signatur Ihrer getParent als:

Node* Node::getParent() 

Node* Node::getParent() { 
    return parent; 
} 

Und in Ihrer Anwendung, wenn Sie darauf zugreifen, überprüfen Sie zuerst.

Node * parent = getParent(); 
if(parent==nullptr){ 
    cout << "parent is null\n"; 
    raise error; 
}else{ 
    // do whatever you want 
} 
1

sollten Sie überprüfen, ob parentnullptr ist oder nicht:

bool Node::getParent(Node& node) 
{ 
    if (parent) 
    { 
     node = *parent; 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

Beachten Sie, dass Sie die richtige Kopie-Konstruktor von Node zu implementieren ist erforderlich. Eine mögliche Lösung besteht darin, den Zeiger oder die Referenz des übergeordneten Knotens zurückzugeben. In mehreren Implementierungen ist dies jedoch gefährlich, da Sie den Zugriff direkt auf ein internes Element zulassen. Entscheide, was gut für dich ist.

Nur ein Vorschlag: Wenn Sie std :: sharer_ptr oder std :: unique_ptr verwenden, wäre eine Implementierung viel einfacher.

+0

Irgendeine Idee, warum der Elternteil nicht richtig zugewiesen wird? Ich habe einen Kopierkonstruktor hinzugefügt, der alle Eigenschaften enthält. Es ist im Grunde ein Knoten mit einer leeren Zeichenfolge und keine Kinder, Eltern, Aktionen usw. – AppreciateIt

+0

In getParent (...) Methode? Bist du sicher, dass das Elternelement kein nullptr ist? Vielleicht wäre ein Code-Snippet hilfreich. –

+0

Ich denke, es ist mit SetParent (..) und nicht GetParent (..), aber nicht sicher, was es verursachen könnte. – AppreciateIt

Verwandte Themen