2017-10-12 4 views
1

Ich bin völlig neu in der Vorlagenprogrammierung. Also habe ich mit einer grundlegenden Template-Programmierung angefangen. Ich habe eine Header-Datei BinaryTree.h gemacht, in der ich einige Fehler erhalte. Bitte beachten Sie unter meinen Code:Eine weitere Vorlagenvariable in der Vorlage in C++ deklarieren

#ifndef BINARYTREE_H_ 
#define BINARYTREE_H_ 

#include <cstdlib> 
#include<ctime> 


template<typename T> 
struct Node 
{ 
    T data; 
    Node *lChild; 
    Node *rChild; 
}; 

template<class T> 
class BinaryTree 
{ 
    private: 
     Node<T> *root; 

     void addHelper(T value, Node<T> *leaf) 
     { 

      if(leaf == NULL) 
      { 
       leaf->data = value; 
       leaf->lChild = NULL; 
       leaf->rChild = NULL; 
      } 

      else if(leaf->lChild == NULL) 
      { 
       leaf->lChild->data = value; 
       leaf->lChild->lChild = NULL; 
       leaf->lChild->rChild = NULL; 
      } 
      else if(leaf->rChild == NULL) 
      { 
       leaf->rChild->data = value; 
       leaf->rChild->lChild = NULL; 
       leaf->rChild->rChild = NULL; 
      } 
      else 
      { 
       srand((int)time(0)); 
       int i = rand() % 2; 
       if(i == 0) 
       { 
        addHelper(value, leaf->lChild); 
       } 
       else 
       { 
        addHelper(value, leaf->rChild); 
       } 
      } 
     } 

     void traverseHelper(Node<T> *leaf) 
     { 
      if(leaf == NULL) 
       return; 
      traverseHelper(leaf->lChild); 
      traverseHelper(leaf->rChild); 
      std :: cout << leaf->data; 
     } 
    public: 
     BinaryTree() 
     { 
      root = NULL; 
     } 

     void addNode(T value) 
     { 
      addHelper(value, root); 
     } 

     void traverseNode() 
     { 
      traverseHelper(root); 
     } 
}; 



#endif /* BINARYTREE_H_ */ 

Jetzt ist mein Haupt test.cpp sieht wie folgt aus:

#include<iostream> 
#include "BinaryTree.h" 

using namespace std; 

int main() 
{ 
    BinaryTree<int> bt; 
    bt.addNode(5); 
    bt.addNode(6); 
    bt.addNode(15); 
    bt.addNode(20); 
    bt.traverseNode(); 
    return 0; 
} 

Aber wenn ich die um den Code auszuführen versucht, es zeigt mir einige Fehler

0 [main] Container 8796 cygwin_exception :: open_stackdumpfile: Versenkung Stack-Trace Containers.exe.stackdump

Kann mir jemand helfen, wo ich den Fehler bekomme

Antwort

2

Sie versuchen, auf ein Element zuzugreifen, das nicht erstellt wurde. Das war der Fehler, den ich bekommen habe. Sie haben nie einen neuen Root-Knoten erstellt. Ich empfehle dringend, in Debug-Optionen Ihrer Plattform zu suchen. Ich habe bisher mehr als 1 Fehler erzielt.

Hier sind einige Schritte zu beheben.

1. in Ihrer void addNode(T value) Funktion benötigen Sie so etwas.

entweder das oder in Ihrem Konstruktor, machen Sie einen Wurzelknoten und lassen Sie es einfach leer sein.

2. In Ihrer Addhelper-Funktion müssen Sie zuerst neue Kinder erstellen, bevor Sie sie zuweisen. siehe unten

else if (leaf->lChild == NULL) 
    { 
     leaf->lChild = new Node<T>(); 
     leaf->lChild->data = value; 
     leaf->lChild->lChild = NULL; 
     leaf->lChild->rChild = NULL; 
    } 

müssen Sie dies dann für den Rest Ihrer Fälle tun.

Während des Debuggens können Sie sehen, welche Zeiger NULL sind und welche nicht, und Sie können Ihren Code Schritt für Schritt sehen und sehen, wenn es bricht.

Hoffe, diese Tipps bringen Sie auf den richtigen Weg. Bis jetzt war der Code gut lesbar und einfach zu sehen, was vor sich ging. Du bleibst nur auf Null-Zeigern stecken.

Verwandte Themen