-2

この問題に遭遇しました。リンクリストを実装する必要がありますが、ノードに格納されている要素のデータ型は、文字列または別のクラスへのポインタである可能性があります。

class Node{
    public:
        string data;
        void *link;
        Node *next;

        Node(){
            link = next = NULL;
        }
        Node(string str){
            data = str;
        }
        Node(void *ptr){
            link = ptr;
        }
};

class List{
    Node *head;
    Node *tail;

    public:
        void insert(string str){
            Node *newNode = new Node(str);
            /* ... */
        }
        void insert(void *ptr){
            Node *newNode = new Node(ptr);
            /* ... */
        }
};

テンプレートを使用しようとしましたが、使用できませんでした。このためにテンプレートを使用するにはどうすればよいですか?

4

2 に答える 2

1

あなたは潜在的にこのようなことをすることができます:

template <class T>
class List 
{
public:
    List(): root(NULL) {};
    ~List();
    bool add(const T& item);
    ....

private:
    typedef struct Node {
        T item;
        struct Node *next;
    } Node; 
    Node *root;
};

これに対する他の答えを見るのは興味深いでしょう。C ++は私の最強のトピックではありませんが、この例はコンパイルして機能するはずです。C ++では、構造体は一種の「デフォルトで公開」クラスであるため、関数を含めることもできます(ただし、代わりにプライベート関数をリストに追加したいと思います)。

于 2012-09-07T22:41:32.563 に答える
1

STLにはstd::listテンプレート化されたクラスがあります。実際に使用する必要があります。ただし、独自のクラスを実装する場合は、次のようにしてみてください。

template<typename T>
class Node
{ 
public: 
    Node *next; 
    T data; 

    Node(const T &value)
        : next(NULL), data(value)
    {
    } 
}; 

template<typename T>
class List
{ 
private:
    Node<T> *head; 
    Node<T> *tail; 

public: 
    List()
        : head(NULL), tail(NULL)
    {
    }

    void insert(const T &value)
    { 
        Node<T> *newNode = new Node<T>(value); 
        if (!head)
            head = newNode;
        if (tail)
            tail->next = newNode;
        tail = newNode;
    } 
}; 
于 2012-09-08T01:52:49.500 に答える