aufzurufen Ich möchte pop() in der Basisklasse implementieren und pop() rufen Sie die richtige abgeleitete Klasse HeapifyUp() -Methode aus der abgeleiteten Klasse. Mir ist klar, dass ich für jede Ableitung ein Pop() machen kann, aber mich interessiert, wie man das lösen soll.Übergeben Sie die Instanz von abgeleitet an die Basis, um die abgeleitete Methode
Wie kann ich eine "generische" Möglichkeit schaffen, entweder minHeap- oder maxHeap-Instanzen an pop() zu übergeben?
class Heap
{
public :
int size;
int *items;
Heap(int n) { this->items = new int[n]; this->size = 0; }
~Heap() { delete[] items; }
int peek() { return items[0]; }
int _pop()
{
int top = items[0];
items[0] = items[size - 1];
--size;
heapifyDown();
return top;
}
}
class minHeap : Heap
{
public :
minHeap(int capacity) : Heap(capacity) {}
void heapifyUp()
{
int index = size - 1;
while(hasParent(index) && (parent(index) > items[index]))
{
swap(getParentIndex(index), index);
index = getParentIndex(index);
}
}
void heapifyDown()
{
}
}
class maxHeap : Heap
{
public:
maxHeap(int capacity) : Heap(capacity) {}
~maxHeap() {}
void heapifyUp()
{
}
void heapifyDown()
{
}
};
Wenn ich etwas nicht vermisse, müssen Sie einfach 'class Heap {virtual void heapifyUp() = {}; // ... etc ... 'und lese natürlich den Abschnitt über" virtuelle Funktionen "in deinem Lehrbuch. –
Sie können 'Heap' eine Template-Klasse erstellen, die einen' HeapStrategy' Template-Parameter akzeptiert. Die 'HeapStrategy' wäre dann entweder' MinHeapStrategy' oder 'MaxHeapStrategy'. Dann 'benutze MinHeap = Heap' und 'benutze MaxHeap = Heap '. Dies ist eine generische Programmiertechnik namens _Policy-Based Design_. Entschuldigung, ich habe keine Zeit, dies zu einer umfassenderen Antwort zu erklären. –
Hoppla, ich hätte 'virtual void heapifyUp() = 0;' oben schreiben sollen - sieht so aus, als müsste ich diesen Abschnitt noch einmal lesen! –