2012-04-23 9 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 *を使用できません。 Node *を宣言する方法はありますか?この方法で使用することはできますか?私の最大の問題は、ノードテンプレートを指定することができないメソッドの中で、すべてのタイプで動作することです。

ありがとうございました。ちょうど同様DynamicListテンプレートを作成してから使用してください。

+1

複数の種類のアイテムを同じリストに入れようとしていますか? –

答えて

2

私の最大の問題は、私はノードテンプレートを指定することはできませんメソッドの内部で、それは

はい、あなたができるすべてのタイプで動作するはずということですNode<T>*。そうすれば、すべてのタイプで動作します。

+1

彼はまず 'DynamicList'をテンプレートクラスにしなければならないでしょう。あなたの答えにそのビットを含めると良いかもしれません。 –

+0

@BenVoigtああ、私はこれまで遠くまでスクロールしていなかった。私は 'Node'クラスの中で' Node * 'の代わりに' Node * 'を使っていたことを知りました。私は一瞬で編集します。 – sepp2k

+0

テンプレート引数を同じクラス内に残しても、実際には問題はありません。標準のセクション9p2には、*注入クラス名*が記述されています。 –

関連する問題