2016-12-02 2 views
-3

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() 
    { 

    } 

}; 
+3

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. –

+1

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. –

+0

Hoppla, ich hätte 'virtual void heapifyUp() = 0;' oben schreiben sollen - sieht so aus, als müsste ich diesen Abschnitt noch einmal lesen! –

Antwort

2

Ich mag pop() in der Basisklasse implementieren und pop() Ruf hat die richtigen abgeleitete Klasse heapifyUp() Methode aus der abgeleiteten Klasse.

Das ist ein Zeichen für schlechtes Design. Die Namen heapifyUp und heapifyDown deuten auf eine Strategie hin.

Sie können mit den Armen Design-Stick und

virtual heapifyUp() = 0; 
virtual heapifyDown() = 0; 

in der Basisklasse erstellen und sie in der abgeleiteten Klasse implementieren. Eine andere Möglichkeit ist es, eine virtual Hilfsfunktion zu verwenden, die in den abgeleiteten Klassen außer Kraft gesetzt werden kann, um ihre eigenen speziellen Dinge zu tun, während sie die Gemeinsamkeit der Basisklasse ausnutzt.

class Heap 
{ 
    public : 

    ... 

    int _pop() 
    { 
     return _pop_impl(); 
    } 

    private: 

    virtual int _pop_impl() 
    { 
     int top = items[0]; 
     items[0] = items[size - 1]; 
     --size; 
     return top; 
    } 
} 

class minHeap : Heap 
{ 
    ... 

    virtual int _pop_impl() 
    { 
     // Additional code for this class. 
     // ... 

     int ret = Heap::_pop_impl(); 

     // Additional code for this class. 
     // ... 
     return ret; 
    } 
} 

class maxHeap : Heap 
{ 
    ... 

    virtual int _pop_impl() 
    { 
     // Additional code for this class. 
     // ... 

     int ret = Heap::_pop_impl(); 

     // Additional code for this class. 
     // ... 
     return ret; 
    } 
} 
+0

@R Sahu - Vielen Dank, dass Sie sich die Zeit genommen haben, die Prinzipien von w.r.t.design zu erklären. Was also, wenn Heap nur von Max oder MinHeap aufgerufen werden kann? Ist es immer noch eine schlechte Wahl? Ich hatte einen Grund, Pop() nur einmal zu definieren. Wie wäre es stattdessen mit einer Vorlage, die es mir erlaubt, meine Absicht zu behalten, Code nicht zu duplizieren? Was denkst du darüber? – AspiringCodeMonkey

+1

@AspiringCodeMonkey, Sie werfen wichtige Fragen auf. Leider ist ein Kommentar der richtige Ort, um sie zu beantworten. Außerdem werden die Fragen, die Sie stellen, besser unter http://softwareengineering.stackexchange.com/ gestellt. –

Verwandte Themen