2013-12-26 3 views
0

Я один раз в семестр работа (собственный двойной связанный список), и наш учитель хочет это определение класса DoubleList:C++ проблемы с преобразованием

template <typename T> //just part of all methods 
class DoubleList { 
public: 

    DoubleList(void); //We HAVE TO follow this definitions 

    void AddFirst(const T &);  //const! 
    T &AccessActual(void); 
    T RemoveFirst(void); 
} 

Мой вопрос, как я могу определить узел? AddFirst имеют аргумент const и другие методы не имеют. Данные должны быть установлены в конструкторе, а затем они не могут быть изменены. Является ли эта задача настолько ограниченной или есть другие способы выполнить задачу?

Вот мой фактический Node:

template <class U> 
     class Node{ 
      Node<U> * next; 
      Node<U> * previous; 
      const U * data; 
     public: 
      Node(const U *data){ // 
       next = NULL; 
       previous = NULL; 
       this->data = data; 
      } 
      void SetNext(Node<U> *next) { 
       this->next = next; 
      } 
      Node<U> *GetNext(){ return next; } 
      void SetPrevious(Node<U> *previous) { 
       this->previous = previous; 
      } 
      Node<U> *GetPrevious(){ return previous; } 
      const U *GetData() { return data; } 
     }; 
+0

Вам не нужно '(аннулируются)' в объявлении метода. –

+0

Ed Heal: Это имеет значение? : D – Pivoman

+0

Да - Это демонстрирует отсутствие понимания языка. –

ответ

0

В контейнерах, обычно лучше иметь копию данных, поэтому изменить const U * data; к U data;

Узел конструктора будет проще в использовании, если это было это подпись Node(const U& data). Нет указателей.

GetData также должен был бы измениться. Верните ссылку. U& GetData().

Опасно хранить адреса элементов данных. Если пользователь списков хочет эту функциональность, он может использовать список, в котором хранятся указатели (например, U = int *)

0

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

Ваш метод AddFirst() должен просто создать новый узел и назначить правильный следующий указатель на новый узел и правильный указатель на «старый» первый узел и настроить фактический объект? к чему это относится?

Ваш интерфейс узлов отличается от этого, возвращая ссылку вместо указателя. Мне довольно странно, что AccessActual всегда может возвращать объект, а когда список пуст, это может быть nullptr ??

пример реализации:

void AddFirst(const T &) 
{ 
    Node<T>* newNode = new Node<T>(T); 
    Node<T>* current = &AccessActual(); // how can there be an actual when the list can be empty or is that impossible? 

    { 
    while(current.GetPrev() != nullptr) 
    { 
     current = *current.GetPrev(); 
    } 
    current.SetPrev(newnode); 
    newnode->SetNext(current); 

    } 

} 
Смежные вопросы