2016-12-02 16 views
-3

pop()を基本クラスに実装し、派生クラスから適切な派生クラスheapifyUp()メソッドをpop()する必要があります。私はそれぞれの派生物についてpop()を作ることができることを認識していますが、私はこの問題をどのように解決すべきかに興味があります。派生メソッドを呼び出すためにderivedからbaseのインスタンスを渡す

minHeapインスタンスまたはmaxHeapインスタンスをpop()に渡すための「汎用」方法を作成するにはどうすればよいですか?

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

私が何かが欠けていない限り、あなたは 'class heap {virtual void heapifyUp()= {};を宣言する必要があります。 // ... etc ... '、もちろん、テキストブックの「仮想関数」のセクションを再度読んでください。 –

+1

'Heap'は' HeapStrategy'テンプレートパラメータを受け入れるテンプレートクラスです。 'HeapStrategy'は' MinHeapStrategy'または 'MaxHeapStrategy'です。次に、MinHeap = Heap を使用し、MaxHeap = Heap を使用します。これは_Policy-Based Design_という一般的なプログラミング手法です。申し訳ありませんが、私はより完全な答えにこれを詳述する時間がありません。 –

+0

私は 'virtual void heapifyUp()= 0;'と書かれているはずですが、そのセクションも再読み込みする必要があります。 –

答えて

2

私は、基本クラスでpop()を実装し、派生クラスからpop()コール適切な派生クラスheapifyUp()メソッドを持っていると思います。

これはデザインが悪いことの兆候です。 heapifyUpheapifyDownという名前は戦略を意味します。

あなたは貧しいデザインに固執し、基底クラスに

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

を作成し、派生クラスでそれらを実装することができます。

もう1つの方法は、基本クラスの共通性を利用しながら、派生クラスでオーバーライドして独自の特殊な処理を行うことができるvirtualヘルパ関数を使用することです。

+0

@R Sahu - w.r.t.designの原則を説明する時間をいただき、ありがとうございます。 ヒープがMaxまたはMinHeapによってのみ呼び出される場合はどうなりますか?それはまだ貧しい選択ですか? pop()を一度定義したいだけの理由がありました。 代わりにテンプレートを使用すると、コードを複製しないようにすることができますか?これについてあなたの考えは何ですか? – AspiringCodeMonkey

+1

@AspiringCodeMonkey、あなたは重要な質問をします。残念ながら、コメントはそれらに答える正しい場所です。また、あなたが求める質問の種類は、http://softwareengineering.stackexchange.com/でよく聞かれます。 –

関連する問題