2012-04-23 2 views
0

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

Прежде всего, я реализую динамический список, где «данные» узла могут использоваться для указания того, что мне нужно. Это общий список для всего приложения, и способ, которым я нашел это, был с шаблонами.

Вот .h, где я реализовал его:

#ifndef DYNAMICLIST_H_ 
#define DYNAMICLIST_H_ 

// **** Node **** 
template <typename T> 
class Node 
{ 
public: 
    Node(int _nodeID, T* _data) 
    { 
     nodeID = _nodeID; 
     next = NULL; 
     data = _data; 
    } 

    Node() 
    { 

    } 

    ~Node() 
    { 
     if(data) 
      delete data; 
    } 

    //sets e gets 

    Node* GetNext() const 
    { 
     return next; 
    } 

    void SetNext(Node* _next) 
    { 
     next = _next; 
    } 

    int GetNodeID() const 
    { 
     return nodeID; 
    } 

    T* GetNodeData() const 
    { 
     return data; 
    } 

    void SetData(T* _data) //provavelmente não será usada 
    { 
     data = _data; 
    } 

private: 

    int nodeID; //numero usado na busca 
    Node* next; //ponteiro pro proximo node 
    T* data; //ponteiro pra uma imagem, uma mensagem, um som, o que quer que seja que precisar ser guardado 
}; 





// **** DynamicList **** 
class DynamicList 
{ 
public: 
    DynamicList(Node* _node) 
    { 
     this->SetHead(_node); 
    } 

    ~DynamicList() 
    { 
     this->DeleteList(); 
    } 

    //sets e gets 
    Node* GetHead() const 
    { 
     return head; 
    } 

    void SetHead(Node* _head) 
    { 
     head = _head; 
    } 

    Node* GetNode(int _nodeID) const 
    { 
     Node *Finder; 
     if (!head) 
      return false; 
     Finder = head; 
     for (; Finder; Finder = Finder->GetNext()) 
     { 
      if (Finder->GetNodeID() == _nodeID) //se o nome for igual, retorna o ponteiro do node 
       return Finder; 
     } 
     return false; 
    } 

    void NewNode (Node* _node) // Método para adicionar um elemento novo ao final da lista. 
    { 
     if (!this->GetHead()) 
     { 
      this->SetHead(_node); 
     } 
     else 
     { 
      Node *Finder = this->GetHead(); 
      while (Finder->GetNext()) 
       Finder = Finder->GetNext(); 
      Finder->SetNext(_node); 
     } 
    } 

    //outras 
    bool Delete(int _nodeID) 
    { 
     Node* deleter; 
     Node* aux; 

     if(!this->GetNode(_nodeID)) //não há mensagem com esse Id na lista 
      return false; 

     if(head->GetNodeID() == _nodeID) 
     { 
      if (!head->GetNext()) //se não houver outro nó além da head, não deletar 
      { 
       delete head; 
       head = NULL; 
      } 
      else 
      { 
       aux = head->GetNext(); //se head tiver a mensagem a ser deletada, head agora aponta para o nó seguinte 
       delete head; 
       head = aux; 
       return true; 
      } 
     } 
     else 
     { 
      deleter = head; 

      while (deleter) //enquanto não chegar no fim 
      { 
       if (deleter->GetNext()) //se há um próximo node 
       { 
        if (deleter->GetNext()->GetNodeID() == _nodeID) //verifica se o próximo tem a node mensagem procurada 
        { 
         aux = deleter->GetNext()->GetNext(); //caso tenha, perde o ponteiro do proximo node e pega o do seguinte 
         delete deleter->GetNext(); 
         deleter->SetNext(aux); 
         return true; 
        } 
       } 
       deleter = deleter->GetNext(); //passa para o próximo 
      } 
      return false; 
     } 
    } 

    void DeleteList() 
    { 
     Node* superDeleter; 
     Node* aux; 

     superDeleter = head; 

     if(!superDeleter) 
      return; 
     else 
     { 
      while(superDeleter->GetNext()) //se há um próximo node 
      { 
       aux = superDeleter->GetNext(); //guarda o proximo 
       delete superDeleter; //deleta o primeiro 
       superDeleter = aux; //aponta para o proximo 
      } 
      delete superDeleter; //deleta o ultimo restante 
     } 
    } 

private: 

    Node* head; 
}; 

#endif 

Мое намерение использовать шаблон для того, чтобы данные общий указатель держать класс в очереди. Проверьте методы в классе. Большинство из них используют Node *, который я проклял, сделав его шаблоном. Теперь Node * нельзя использовать без указания типа в объявлениях? Есть ли способ объявить узел *, чтобы я мог использовать его в этих методах? Моя самая большая проблема заключается в том, что внутри методов я не могу указать шаблон узла, он должен работать со всеми типами.

Спасибо.

+1

Вы пытаетесь иметь более одного типа предметов в одном списке? –

ответ

2

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

Да, вы можете: просто сделать DynamicList это шаблон, а затем использовать Node<T>*. Таким образом, он будет работать со всеми типами.

+1

Сначала ему нужно было бы создать 'DynamicList' класс шаблонов, возможно, было бы неплохо включить этот бит в ваш ответ. –

+0

@BenVoigt О, я не проскальзывал так далеко. Я только видел, что он использовал 'Node *' вместо 'Node *' внутри класса 'Node', и я думал, что это единственная проблема. Я отредактирую через секунду. – sepp2k

+0

Оставив аргументы шаблона внутри одного класса, на самом деле не проблема. Раздел 9p2 стандарта описывает * injected-class-name *. –

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