2016-07-04 30 views
-3

Ich habe ein dynamisches Vorlagenarray als Mitglied meiner Klasse. Allerdings kann ich das Array im Konstruktor oder in anderen Funktionen nicht ändern. Ich bin verwirrt über die Syntax. Hier ist der Code:Wie ändern Sie die Größe eines dynamischen Vorlagenarrays?

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) { 
     HeapNode<Type> *array = new HeapNode<Type>[n]; 
    } 

Das Array ist ein Array von HeapNode<Type> Objekte aus der HeapNode Klasse enthalten sind. Hier ist der Konstruktor für die HeapNode-Klasse:

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

Verwenden Sie ein 'std :: VECTOR' statt. –

+1

Auf die gleiche Weise ändern Sie die Größe eines "dynamischen Nicht-Template-Arrays". – juanchopanza

Antwort

2

Es gibt mehrere Probleme mit dem angezeigten Code.

HeapNode<Type> *array[]; 

Wie beschrieben, sollte dies einfach zu erklären:

HeapNode<Type> *array; 

Dann im Konstruktor:

HeapNode<Type> *array = new HeapNode<Type>[n]; 

Diese eine Variable in der Konstruktor-Funktion erklärt, die "Array" genannt . Dies tut absolut nichts, um ein Klassenmitglied dieses Namens zu initialisieren. Der Konstruktor sollte einfach sein:

MaxHeapTree(int n = 10) : array(new HeapNode<Type>[n]), elementSize(0), 
          height(0), leafCounter(0) 
{ 
} 

Vermutlich die Größe des Array, n, sollte auch irgendwo gespeichert werden. Aber dieser Teil wurde in der Frage nicht gezeigt.

Darüber hinaus würde ich auch die Notwendigkeit in Frage stellen, dynamische Zuordnung hier zu verwenden. Ich sehe hier nichts, was nicht durch Verwendung eines std::vector anstelle des dynamisch zugewiesenen Arrays erreicht werden kann. Moderner C++ Code benötigt selten new oder irgendetwas, insbesondere Arrays. Standard-C++ - Container machen in den meisten Fällen eine dynamische Zuweisung überflüssig. Wenn std::vector hier von Anfang an verwendet wurde, wäre dieses Problem in erster Linie nicht passiert.

+0

Ich wurde beauftragt, ein dynamisches Array zu verwenden, um einen Heap-Baum zu erstellen. Allerdings habe ich diese Initialisierung zuvor versucht und es wird nicht kompiliert. – luigi741

+2

"Es wird nicht kompiliert" ist keine nützliche Problembeschreibung. –

+0

'MaxHeapTree.h: In Instantiierung 'MaxHeapTree :: MaxHeapTree (int) [mit Type = std :: __ cxx11 :: basic_string ]': main.cpp: 14: 61: benötigt, um von hier MaxHeapTree.h: 22:98: Fehler: keine passende Funktion für den Aufruf von 'HeapNode > :: HeapNode()' xHeapTree (int n = 10): Array (neue HeapNode [n]), ElementSize (0), height (0), leafCounter (0) ' – luigi741

1

einen Behälter verwenden, um es zu verwalten:

std::vector<HeapNode<Type>> array