自定义双向链表迭代器

时间:2015-05-26 19:22:02

标签: c++ iterator

正如标题所示,我已经为迭代器创建了自己的模板,如下所示:

template <class Element>
class IteratorDL {
private:
    DoubleNode<Element> *current;
public:
    IteratorDL(DoublyList<Element>);
    ~IteratorDL();
    void next();
    void back();
    bool isValid();
    Element getCurrent();
};

template <class Element>
IteratorDL<Element>::IteratorDL(DoublyList<Element> dl) {
    current = dl.first;
    cout << current->info; //this will return to me the correct value that I'm looking for
}

template <class Element>
Element IteratorDL<Element>::getCurrent() {
    if (isValid()) {
        COUT << current->info; // this will return to me something like an address, random numbers, I don't know.
        return current->info;
    }
    else {
        return 0;
    }
}

我只发布了真正让我烦恼的两个功能。我应该在双链表上使用它(同样,定制)。 DoubleNode看起来像这样: 模板

class DoubleNode {
private:
    Element info;
    DoubleNode *next;
    DoubleNode *back;

我遇到的问题是getCurrent()没有返回它应该返回给我的节点当前包含的值,但它返回给我类似于地址,我真的不能说。我评论了迭代器代码,这样你就可以更好地理解发生了什么,我对c ++很陌生,这就是为什么我不能理解哪里出错了。

我还尝试将链表作为迭代器的私有部分,但它仍然没有解决问题。经过进一步的研究,我认为getCurrent()正在返回记忆的其他部分,因此出于某种原因,current->info没有导致它应该在哪里?< / p>

我也试过这种方法:

private:
    DoublyList<Element> dl;
    DoubleNode<Element> *current;

但同样的问题

使用调用函数的代码进行编辑:

DoublyList<int> dl;
    dl.addFirst(1);
    dl.addFirst(2);
    dl.addFirst(3);
    dl.addFirst(4);
    int c;
    IteratorDL<int> *it = new IteratorDL<int>(dl);
    cout << it->getCurrent(); //this should return 4 but it returns random number
//  c = it->getCurrent();
//  assert(c == 4);

编辑双重列表声明:

template <class Element>
class DoublyList {
private:
    DoubleNode<Element> *first;
    DoubleNode<Element> *last;
    int count;

1 个答案:

答案 0 :(得分:1)

在构造函数代码中有 current = dl.first Current是一个指针,你可以为它指定一个从构造函数copy参数中获得的指针值 当你调用getCurrent()时,current指向的内存在getCurrent调用时不再有效,因为在构造函数调用时已经创建了一个列表的临时副本,并且在调用之后不再存在。(如果你没有定义复制构造函数)编译器只是复制类的成员) 通过添加&amp;在参数名称之前,这通过引用成为参数意味着代码通过引用直接处理原始列表,并且因为列表在getCurrent调用时仍然存在,所以