2016-07-04 27 views
0

Ich habe Probleme beim korrekten Einrichten und Zugreifen auf meine Mitgliedsfunktionen einer Klasse. Diese Knotenklasse wird verwendet, um einen Max-Heap-Baum zu erstellen. Wenn der Baum initialisiert wird, erhalte ich jedoch Mülldaten und nicht, worauf ich ihn initialisiere.Wie initialisieren Sie Vorlagenklassenmitglieder, die andere Vorlagenklassen verwenden?

#ifndef HEAPNODE_H_INCLUDED 
#define HEAPNODE_H_INCLUDED 

#include <iostream> 
#include <cstdlib> 
#include <array> 
using namespace std; 

template <class Type> class HeapNode { 
private: 
    int key; 
    Type value; 
public: 
    HeapNode(int key, Type const &value) { 
     this->key = key; 
     this->value = value; 
    } 

    // Returns the key of the node 
    int getKey() { 
     return key; 
    } 

    // Returns the value of the node 
    Type getValue() { 
     return value; 
    } 

    // Displays the node 
    void displayNode() { 
     cout << "Key: " << key << "\tValue: " << value << endl; 
    } 
}; 

#endif 

Hier ist die Klasse, die meinen Heap Tree erstellt. Ich habe versucht, die Initialisierungen im Konstruktor in alle Richtungen zu setzen, und ich bekomme immer noch Junk-Daten. Außerdem setze ich den Konstruktor auf eine ganze Zahl, aber wenn ich eine Struktur in meinem Treiberprogramm erstelle, kann ich kein Argument dafür eingeben, das ein Array dieser Größe initiiert.

#ifndef MAXHEAPTREE_H_tINCLUDED 
#define MAXHEAPTREE_H_INCLUDED 

#include <iostream> 
#include <cstdlib> 
#include <fstream> 
#include <string> 
#include "HeapNode.h" 
using namespace std; 

template <class Type> class MaxHeapTree { 
private: 
    HeapNode<Type> *array; 
    HeapNode<Type> *root; 
    int elementSize; 
    int height; 
    int leafCounter; 
public: 
    // Constructor 
    MaxHeapTree(int n = 10) : elementSize(0), height(0), leafCounter(0) { 
     this->elementSize = elementSize; 
     this->height = height; 
     this->leafCounter = leafCounter; 
     HeapNode<Type> *array = new HeapNode<Type>[n]; 
    } 

    // Destructor 
    ~MaxHeapTree(); 

    void arrayDisplay() { 
     cout << "Original array size: " << sizeof(array)/4 << endl; 
    } 

    // Returns the number of elements in the tree 
    int getSize() { 
     return elementSize; 
    } 

    // Returns the height of the tree 
    int getHeight() { 
     return height; 
    } 

    // Returns the number of leaves in the tree 
    int leaves() { 
     return leafCounter; 
    } 

    int countLines(const string fileName) { 
     string line; 
     int lineCount = 0; 

     ifstream myFile (fileName.c_str()); 
     if (myFile.is_open()) { 
      while (getline(myFile, line)) { 
       lineCount++; 
      } 
     } 
     else { 
      cout << "Error opening file" << endl; 
     } 
     myFile.close(); 
     return lineCount; 
    } 

    // Reads structure from a text file and builds a max heap 
    void buildTree(const string fileName) { 
     string line; 
     string key; 
     string value; 
     int lines = countLines(fileName); 
     int i = 0; 
     cout << "Lines: " << lines << endl; 
     HeapNode<Type> *newArray[lines]; 
     cout << "Size of newArray: " << sizeof(newArray)/4 << endl; 

     ifstream myFile (fileName.c_str()); 
     if (myFile.is_open()) { 
      while (getline(myFile, line)) { 
       key = line.substr(0, 1); 
       int x = atoi(key.c_str()); 
       value = line.substr(1); 

       HeapNode<Type> *hNode = new HeapNode<Type>(x, value); 

       newArray[i] = hNode; 
       cout << "newArray[" << i << "] = "; 
       newArray[i]->displayNode(); 
       i++; 
      } 
     } 
     else { 
      cout << "2 - Error opening file." << endl; 
     } 
     myFile.close(); 
    } 
}; 

#endif 
+1

Beachten Sie, dass Array ein Zeiger ist, so dass sizeof (array) unabhängig von n eine Konstante (4 oder 8, abhängig davon, ob auf 64 Bit kompiliert wird) zurückgibt. Außerdem sollten Sie [] -Array in ~ MaxHeapTree() löschen. – stewbasic

+0

In Ihrem 'MaxHeapTree <>' Konstruktor, diese Zeile: 'HeapNode * Array = neue HeapNode [n];' ist das Problem. Sie initialisieren nicht das 'MaxHeapTree <>' -Datenelement namens 'Array', Sie initialisieren eine neue lokale Variable. Darüber hinaus verlieren Sie Speicher jedes Mal, wenn eine Instanz erstellt wird. – user2296177

+0

@ user2296177 Wie würde das erklären, warum elementSize, height und leafCounter neben Array auch Junk-Daten liefern? – luigi741

Antwort

0

Wie initialisieren Sie Template-Klasse Mitglieder, die anderen Template-Klassen verwendet?

Auf die gleiche Weise initialisieren Sie Mitglieder von Nicht-Vorlagen, die keine anderen Vorlagen verwenden.

Wenn der Baum initialisiert wird, bekomme ich Mülldaten und nicht was ich initialisiere.

Ich war MaxHeap<string> *heapTree1;

Nun verwenden, ist es Ihr Problem. Anscheinend haben Sie nie eine Instanz von MaxHeap<string> erstellt.

+0

Sorry, das war ein Fehler. Ich habe es mit 'MaxHeapTree * heapTree1;' initialisiert – luigi741