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

Тогда вы не понимаете, для чего используется шаблон декоратора. Он используется, когда у вас есть требование для одного интерфейса, и у вас есть другой. Поэтому вы используете декоратор для обеспечения требуемого интерфейса. То, что вы пытаетесь сделать совершенно не связанным с рисунком декоратора. – 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; 
    } 
    ... 
}; 

Код не проверен, хотя может иметь логические ошибки, как было написано, чтобы показать общую идею.