【问题标题】:Custom doubly linked list iterator自定义双向链表迭代器
【发布时间】:2015-05-26 19:22:01
【问题描述】:

正如标题所示,我为迭代器制作了自己的模板,如下所示:

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;
    }
}

我只发布了真正困扰我的 2 个功能。我应该在双向链接列表(相同,定制)上使用它。 DoubleNode 看起来像这样: 模板

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

我遇到的问题是 getCurrent() 没有返回它应该返回给我的当前节点中包含的值,但它返回给我的东西就像一个地址,我真的不知道。我评论了迭代器代码,以便您可以更好地理解发生了什么,而且我对 c++ 还很陌生,这就是为什么我可能不明白哪里出了问题。

我也尝试将链表作为迭代器的私有部分,但仍然没有解决问题。经过进一步研究,我相信getCurrent() 正在返回内存的其他部分,所以出于某种原因,在那个特定功能中,current-&gt;info 不会导致它应该去哪里?

我也尝试过这种方法:

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;

【问题讨论】:

    标签: c++ iterator


    【解决方案1】:

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

    【讨论】:

    • 我刚才编辑了我的评论,想法相同,在 getCurrent() 中,current->info 不会导致我想要的内存的同一部分。我尝试使链表成为迭代器的一部分,并在构造函数中有类似 this->dl = dll; 的东西。当前 = dl.first;这样我的列表仍然有效,但它没有解决问题
    • 你能复制/粘贴调用迭代器构造函数和getCurrent调用的代码吗?
    • 完成。编辑了我的帖子并在最后添加了代码。我尝试将它作为指针,作为非指针,我尝试将列表设为指针,更改了所有代码,并且每次 getCurrent() 返回错误
    • DoublyList 是如何声明的?
    • 编辑了帖子并添加了该内容
    猜你喜欢
    • 2015-07-14
    • 2017-07-25
    • 2015-07-13
    • 1970-01-01
    • 2021-02-27
    • 2013-10-10
    • 2016-01-22
    • 1970-01-01
    相关资源
    最近更新 更多