2016-07-04 6 views
0

У меня возникли проблемы с правильной настройкой и доступом к моим функциям-членам класса. Этот класс node используется для построения Max Heap Tree. Однако, когда дерево инициализируется, я получаю данные мусора, а не то, для чего я инициализирую его.Как вы инициализируете члены класса шаблонов, которые используют другие классы шаблонов?

#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 

Вот класс, который строит мое кучу дерева. Я пробовал устанавливать инициализации в конструкторе каждый путь, и я все еще получаю ненужные данные. Кроме того, я задал конструктору целое число, но когда я создаю дерево в моей программе драйверов, он не позволит мне помещать аргумент для него, который инициирует массив такого размера.

#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

Обратите внимание, что массив является указателем, поэтому sizeof (array) возвращает константу (4 или 8 в зависимости от того, скомпилирована ли она на 64 бит) независимо от n. Также вы должны удалить массив [] в ~ MaxHeapTree(). – stewbasic

+0

В конструкторе 'MaxHeapTree <>' эта строка: 'HeapNode * array = new HeapNode [n];' это проблема. Вы не инициализируете элемент данных 'MaxHeapTree <>', называемый 'array', вы инициализируете новую локальную переменную. Кроме того, вы утечка памяти каждый раз, когда экземпляр построен. – user2296177

+0

@ user2296177 Как это объясняет, почему elementSize, height и leafCounter предоставляют данные для мусора, хотя в дополнение к массиву? – luigi741

ответ

0

Как вы инициализации членов класса шаблона, который использует другие классы шаблонов?

Точно так же вы инициализируете элементы не шаблонов, которые не используют другие шаблоны.

Когда дерево инициализируется, я получаю данные мусора, а не то, что инициализирую его.

Я использовал MaxHeap<string> *heapTree1;

Ну, есть ваша проблема. Видимо, вы никогда не создавали экземпляр MaxHeap<string>.

+0

Извините, это была ошибка. Я инициализировал его 'MaxHeapTree * heapTree1;' – luigi741

 Смежные вопросы

  • Нет связанных вопросов^_^