0

構造体のリンクリストがあります:

typedef struct {
    std::string title;
    int rating;
} listing;

私のリストのクラスの一部である標準イテレータ:

template<class T>
class ListIterator
{
public:
    ListIterator( ) : current(NULL) {}

    ListIterator(Node<T>* initial) : current(initial) {}

    const T& operator *( ) const { return current->getData( ); }
    //Precondition: Not equal to the default constructor object,
    //that is, current != NULL.

    ListIterator& operator ++( ) //Prefix form
    {
        current = current->getLink( );
        return *this;
    }

    ListIterator operator ++(int) //Postfix form
    {
        ListIterator startVersion(current);
        current = current->getLink( );
        return startVersion;
    }

    bool operator ==(const ListIterator& rightSide) const
    { return (current == rightSide.current); }

    bool operator !=(const ListIterator& rightSide) const
    { return (current != rightSide.current); }

    //The default assignment operator and copy constructor
     //should work correctly for ListIterator,
private:
    Node<T> *current;
};

これは、標準データ型 (int、char、string など) のリストを処理する場合は問題なく機能しますが、リスト内の各構造体のデータを反復処理する方法がわかりません。

それは私がそれらをどのように保管しているかが原因である可能性があります:

// declaration of list, Queue is list class name
Queue<listing> list;

// data reads from file
while (!datafile.eof()) {

    listing entry = *new listing;

    datafile >> listing.rating;
    std::getline(datafile, listing.title);

    list.add(entry);

}

これが曖昧すぎないことを願っています。さらにコードが必要な場合はお知らせください。

ノードおよびキュー クラス:

template<class T>
class Node
{
public:
    Node(T theData, Node<T>* theLink) : data(theData), link(theLink){}
    Node<T>* getLink( ) const { return link; }

    const T& getData( ) const { return data; }

    void setData(const T& theData) { data = theData; }
    void setLink(Node<T>* pointer) { link = pointer; }

private:
    T data;
    Node<T> *link;
};

template<class T>
class Queue
{
public:
    typedef ListIterator<T> Iterator;

    Queue( );
    // Initializes the object to an empty queue.

    Queue(const Queue<T>& aQueue);

    Queue<T>& operator =(const Queue<T>& rightSide);

    virtual ~Queue( );

    void add(T item);
    // Postcondition: item has been added to the back of the queue.

    T remove( );
    // Precondition: The queue is not empty.
    // Returns the item at the front of the queue
    // and removes that item from the queue.

    bool isEmpty( ) const;
    // Returns true if the queue is empty. Returns false otherwise.

    Iterator begin() const { return Iterator(front); }
    Iterator end() const { return Iterator(); }

private:
    Node<T> *front; // Points to the head of a linked list. 
                    // Items are removed at the head

    Node<T> *back; // Points to the node at the other end of the linked list.
                   // Items are added at this end.
};
4

1 に答える 1

0

解決策は非常に簡単でした。恥ずかしくて今まで見れませんでした。

Queue<listing>::Iterator all;
for (all = list.begin(); all != list.end(); all++) {

    listing entry = *all;
    cout << entry.title << " ";
    cout << entry.rating << "\n";

}
于 2012-11-26T06:26:44.530 に答える