后缀运算符链接列表通用节点迭代器

时间:2019-04-02 00:54:09

标签: c++

我正在尝试通过链表节点迭代器进行迭代。该代码在编译中未显示任何错误,但是,不会打印放置在链接列表节点中的数据。这是代码。

#pragma once
using namespace std;

template <class T>
class ListNode {
public:
    T fData;
    ListNode* fNext;

    ListNode(const T& aData, ListNode* aNext = (ListNode*)0) {
        fData = aData;
        fNext = aNext;
    }
};

用于实例化节点的ListNodeTemplate。

#pragma once
#include "ListNodeTemplate.h"

using namespace std;

template <class T>
class ListNodeIterator
{
private:
    ListNode<T>* fNode;
public:
    typedef ListNodeIterator<T> Iterator;
    ListNodeIterator(ListNode<T>* aNode);
    const T& operator*() const;
    Iterator& operator++();
    Iterator operator++(int);
    bool operator==(const Iterator& aOther) const;
    bool operator!=(const Iterator& aOther) const;
    Iterator end();

};

ListNodeIterator头文件,您可以看到ListNodeTemplate包含在迭代器的头文件中。

#include "pch.h"
#include "ListNodeIterator.h"

using namespace std;

template <class T>
ListNodeIterator<T>::ListNodeIterator(ListNode<T>* aNode) {
    fNode = aNode;
}
template <class T>
const T& ListNodeIterator<T>::operator*() const {
    return fNode->fData;
}

template <class T>
typename ListNodeIterator<T>::Iterator& ListNodeIterator<T>::operator++() { //prefix
    fNode = fNode->fNext;
    return *this;
}

template <class T>
typename ListNodeIterator<T>::Iterator ListNodeIterator<T>::operator++(int) { //postfix
    ListNodeIterator<T> temp = *this;
    fNode = fNode->fNext;
    return temp;
}

template <class T>
bool ListNodeIterator<T>::operator==(const Iterator& aOther) const {
    return (fNode == aOther.fNode);
}

template <class T>
bool ListNodeIterator<T>::operator!=(const Iterator& aOther) const {
    return !(*this == aOther.fNode);
}

template <class T>
typename ListNodeIterator<T>::Iterator ListNodeIterator<T>::end() {
    return *this = nullptr;
}

到目前为止,我确定的是postfix运算符似乎没有迭代链接列表节点。编译器未显示任何编译错误。

这是main.cpp

#include "pch.h"
#include <iostream>
#include "ListNodeIterator.cpp"
using namespace std;
int main()
{
    typedef ListNode<int> IntegerNode;
    IntegerNode One(1);
    IntegerNode Two(2, &One);
    IntegerNode Three(3, &Two);

    for (ListNodeIterator<int> iter(&Three); iter != iter.end(); ++iter) {
        cout << "Value " << *iter << endl;
    }
    system("pause");
    return 0;
}

到目前为止,它什么都不打印。

我的预期输出是:

Value 3
Value 2
Value 1

关于此问题是什么以及如何加以改善的任何建议?

1 个答案:

答案 0 :(得分:1)

我只看了一下。稍后我可以更详细地查看,但是我注意到有两件事有待确认,但是一旦阅读,您可能会立即看到:

1)我认为您按以下顺序实例化了列表对象:1-> 2->3。因此,如果从3开始迭代器,则没有下一个节点。

2)看来您的Iterator类有一个end()函数很奇怪。这通常是容器会知道的东西。我认为迭代器不应该对容器的其余部分有任何了解。同样在end()中,将* this分配给nullputr可能会清除所有内容,因此当您尝试打印时,没有任何内容可以打印。