0

デコレータデザインパターンのコンセプトを掴むのは難しいので、デザインパターンについてはかなり初心者です。単独でリンクされたリストクラスを継承する二重リンクリストクラスに飾ることは可能ですか?デコレータデザインパターンを使用して単一リンクリストをデコレートしてリストを作成する

ListAsSLL.h:二重リンクリストクラスに前のノードへのポインタを持つ構造体を持つの追加機能と同じ機能を与える

#ifndef LISTASSLL_H 
#define LISTASSLL_H 

class ListAsSLL 
{ 
protected: 
    struct node{ 
     int i; 
     struct node* next; 
    }; 
    node* head; 
    node* tail; 
    int listSize; 

public: 
    ListAsSLL(); 
    virtual void addToBeginning(int obj); 
    virtual void addAtPos(int obj, int i); 
    virtual void addToEnd(int obj); 
    virtual void del(int i); 
    virtual void overwrite(int obj, int i); 
    virtual void grow(); 
    virtual void shrink(); 
}; 

#endif //LISTASSLL_H 

私は以下のクラスを飾るしたいと思います。

うまくいけば、誰かがこれを行う方法についていくつかの光を当てることができたらうれしいです。前もって感謝します。

+0

実装する必要がある二重リンクリストのインターフェイスは何ですか? – Slava

+0

@ Slava ListAsSLLとまったく同じインターフェイス – Keagansed

+0

あなたはどのデコレータパターンが使用されているのか分かりません。これは、1つのインタフェースが必要で、別のインタフェースが必要な場合に使用されます。したがって、必要なインタフェースを提供するためにデコレータを使用します。あなたはデコレータのパターンに完全に無関係にしようとしているものです。 – Slava

答えて

0

ここでは、その実装方法の例を示します。別の仮想メソッドcreateNodeを追加し、addToBeginning()の可能な実装を示しました。

class ListAsSLL 
{ 
protected: 
    struct node{ 
     int i; 
     struct node* next; 
    }; 
    node* head; 
    node* tail; 
    int listSize; 

    virtual node *createNode() { return new node; } 
public: 
    virtual void addToBeginning(int obj) 
    { 
     node *node = createNode(); 
     node->i = obj; 
     node->next = head; 
     if(!head) tail = node; 
     head = node; 
     ++listsize; 
    } 
    ... 
}; 

class ListAsDLL 
{ 
protected: 
    struct dnode : node{ 
     node* prev; 
    }; 

    virtual node *createNode() { return new dnode; } 
public: 
    virtual void addToBeginning(int obj) 
    { 
     node *prevHead = head; 
     ListAsSLL::addToBeginning(obj); 
     static_cast<dnode *>(head)->prev = prevHead; 
    } 
    ... 
}; 

コードはテストされていませんが、一般的なアイデアを示すために書かれたロジックエラーがある可能性があります。

関連する問題