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* を宣言する方法はありますか? 私の最大の問題は、メソッド内でノード テンプレートを指定できないことです。すべてのタイプで機能するはずです。

ありがとう。

4

1 に答える 1

2

私の最大の問題は、メソッド内でノード テンプレートを指定できないことです。すべてのタイプで機能するはずです。

はい、できます:DynamicListテンプレートも作成してから を使用してNode<T>*ください。そうすれば、すべてのタイプで機能します。

于 2012-04-23T04:07:17.837 に答える