首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有空对象模型的c++双链接列表

具有空对象模型的c++双链接列表
EN

Stack Overflow用户
提问于 2012-07-15 17:23:08
回答 3查看 376关注 0票数 1

我正在尝试创建一个带有空对象模型的双链接列表。到目前为止,我已经实现了将节点添加到列表开头的方法和显示节点的方法。我的问题是显示函数总是显示0。有人能指出我哪里出了问题吗?怎么解决?另外,我是否在正确的轨道上正确地实现了空对象模型?

注:,这是学校的作业。请不要只是在没有解释的情况下发布解决方案。我想了解和了解这里发生了什么。

编辑:修复了显示问题后,我还有另一个问题:当使用一个空的或有节点的列表调用getHead()或getTail()时,它一直希望使用节点类中的self(),而不是nullNode类(在出现空列表的情况下)或elementNode类(在有节点的列表的情况下)。我被困在如何解决这个问题上了。

如果我打印出container.getNext()和容器的地址(对于空列表),那么两个地址是相同的,所以不应该将->self()添加到从nullNode类调用self()方法的末尾?

代码语言:javascript
复制
class node {
public:

    node(){/* Do nothing */}

    node(int e){ element = e; }

    int getData(){ return element; }

    void setData(int e){ element = e; }

    friend class list;
protected:
    node* getNext(){ return next; }

    void setNext(node* n){ next = n; }

    node* getPrev() { return prev; }

    void setPrev(node* n){ prev = n; }

    node* self();

private:

    int element;
    node* next;
    node* prev;
};

class nullNode : public node{
public:
    nullNode(){/* Do nothing */}

    int getData(){ return NULL; }

    void setData(int e){ /* Do Nothing */ }

    node* getNext(){ return head; }

    void setNext(node* n){ head = n; }

    node* getPrev() { return tail; }

    void setPrev(node* n){ tail = n; }

    node* self(){ return NULL; }
private:
    node* head;
    node* tail;
};

class elementNode : public node{
public:
    elementNode(){/* Do nothing */}

    elementNode(int element){
        setData(element);
}

    int getData(){ return node::getData(); }

    void setData(int e){ node::setData(e); }

    node* getNext(){ return node::getNext(); }

    void setNext(node* n){ node::setNext(n); }

    node* getPrev() { return node::getPrev(); }

    void setPrev(node* n){ node::setPrev(n); }

    node* self(){ return this; }
};

class list{
public:

    list();

    node* getHead(){ return (container.getNext())->self(); }

    node* getTail(){ return (container.getPrev())->self(); }

    node* addHeadNode(int e);

    void removeNode(node* n);

    void insertBefore(node* n, int e);

    void insertAfter(node* n, int e);

    void displayNode(node *n);

private:

    nullNode container;
};

list::list()
{
    container.setNext(&container);
    container.setPrev(&container);
}

node* list::addHeadNode(int e)
{
    node* foo = new elementNode(e);

    foo->setPrev(&container);
    foo->setNext(container.getNext());
    container.getNext()->setPrev(foo);
    container.setNext(foo);
    return foo;
}

void list::displayNode(node* n)
{
    cout << "Node Data: " << n->getData() << endl;
}
int main()
{
    list myList;
    node* myNode;
    myNode = myList.addHeadNode(5);
    myList.displayNode(myNode);

    return 0;
}
EN

回答 3

Stack Overflow用户

发布于 2012-07-15 17:28:29

代码语言:javascript
复制
elementNode(int element)
{
    node e;
    e.setData(element);
}

这段代码在做什么?您可以创建节点e,但它似乎会被丢弃,而不会添加到任何列表中。

票数 0
EN

Stack Overflow用户

发布于 2012-07-15 17:36:23

这个问题隐藏在

代码语言:javascript
复制
elementNode(int element){
    node e;
    e.setData(element);
}

这里发生什么事情?首先创建node类的实例,然后调用其setData成员函数。当然,有足够多的e被修改为element值,但是就在下一刻,eelement都消失了,因为初始化它们的范围已经停止了(由}终止),而element中的信息却没有被保存到任何地方。

但是,如果将上面的代码替换为

代码语言:javascript
复制
elementNode(int element){
    setData(element);
}

它调用继承的setData成员函数,保存element的值,程序按预期输出5

票数 0
EN

Stack Overflow用户

发布于 2012-07-15 17:38:10

您的elementNode构造函数正在尝试初始化它的node部件:

代码语言:javascript
复制
elementNode(int element){
  node e;
  e.setData(element);
}

实际上,您只需构造一个不相关的节点,然后放弃它。

您想要调用超类构造函数,这可以在子类构造函数的初始化列表中完成:

代码语言:javascript
复制
elementNode(int element) : node(element) {
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11494039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档