2016-06-17 18 views
0

Ich habe dieses Stück Code:Binary Baum mit Klassen

class Node{ 
public: 
    Square square; 
    Node *NW; 
    Node *NE; 
    Node *SW; 
    Node *SE; 

}; 

int main() 
{ 
    Square s(2,3,1); 
    Node *root; 

    root->square=s; 
    cout<<root->square.length(); 

} 

Square ist ein Klasse-I erstellt. Aber wenn ich diesen Code ausführe, bekomme ich den Segmentierungsfehler 11. Grundsätzlich möchte ich ein Objekt der Klasse Square als Datentyp eines Baumes verwenden, und die Länge ist eine Funktion des quadratischen Objekts. Warum ist das falsch?

+0

Ich denke, Sie müssen lesen, wie Zeiger richtig zu verwenden. Das Problem hat nichts mit Quadraten und Knoten zu tun. – PaulMcKenzie

+0

Die Zweige scheinen vier Kinder zu haben, daher ist die Struktur eigentlich ein quaternärer Baum. – user2079303

+0

Das Problem hat alles mit NULL-Zeigern zu tun, Speicher zuweisen und Ihre Zeiger zeigen auf * gültig * Objekte. –

Antwort

3

Sie sollten Ihre Node auf dem Stapel

int main() 
{ 
    Square s(2,3,1); 
    Node root; 

    root.square = s; 
    cout << root.square.length(); 
} 

Das aktuelle Problem ist, dass Sie mit einem nicht initialisierten, nicht zugeordneten Zeiger deklarieren. Wenn Sie an einem Zeiger bleiben möchten (was in diesem Fall keinen Grund gibt), müssten Sie new es (dann erinnern Sie sich an delete es auch).

int main() 
{ 
    Square s(2,3,1); 
    Node *root = new Node; 

    root->square = s; 
    cout << root->square.length(); 

    delete root; 
} 

In der modernen C++, wenn Sie einen Zeiger tun müssen (zum Beispiel, wenn die Klasse polymorph ist, usw.) sollten Sie einen intelligenten Zeiger anstelle eines Rohzeiger bevorzugen.

int main() 
{ 
    Square s(2,3,1); 
    auto root = std::make_unique<Node>(); 

    root->square = s; 
    cout << root->square.length(); 
} 
+0

Ich habe die erste Option versucht, aber ich bekomme das: implizite Standardkonstruktor für 'Node' muss explizit initialisieren das Mitglied 'Quadrat', die keinen Standardkonstruktor hat – Silviu

0
root = new node; 
root -> squares = s; 
delete root; 
root = NULL; 

Sie müssen für den Zeiger Speicher zuzuweisen. Sie versuchen, einen Zeiger zu dereferenzieren, der nicht zugewiesen wurde. Deshalb segfaulst du.

+0

Während Ihre Antwort gut ist, fügen Sie kleine Details hinzu. – Ajay

+0

ja! Danke. – cloudiebro

+1

bitte ein Löschen hinzufügen – lorro