C ++指针链表

时间:2014-10-06 00:31:49

标签: c++

所以我不熟悉c ++抱歉,如果不清楚的话。

我有一个班级:

class Item
{
    int noItem;
    int qItem;
public:
    Item(int noItem, int qItem)
    {
            this->noItem = noItem;
            this->qItem = qItem;
    }

    int getNoItem()
    {
            return noItem;
    }

    int getQntItem()
    {
            return qItem;
    }
};

然后是以下课程:

class Element
{
public:
    Element()
    {
            data = NULL;
    }

    //to set and access data hold in node
    void setElement(Item *data)
    {
            this->data = data;
    }
    Item* getElement(void)
    {
            return(data);
    }

private:
    Item *data;
};

这个也是:

class ListeChainee
{
public:

    ListeChainee()
    {
        courant = NULL;
    }
    void ajoutListe(Item *data)
    {
        Element *newData;

        //set data
        newData->setElement(data);

        //check if list is empty
        if( courant == NULL)
        {           
            //set current pointer
            courant = newData;
        }


    }

    //get data from element pointed at by current pointer
    Item* elementCourant(void)
    {
            if(courant != NULL)
            {
                return courant->getElement();
            }
            else
            {
                return NULL;
            }
    }

private:
    //data members
    Element *courant;           //pointer to current element in list

};

代码缺少其他东西,但我的问题是:

int main(int argc, char* argv[])
{
    ListeChainee listeCH;
    Item i1(123,456);

    listeCH.ajoutListe(&i1);

    cout << listeCH.elementCourant()->getNoItem();

    system("pause");

    return 0;
}

我希望输出123,但我看到其他一些数字。不知道为什么。 感谢。

2 个答案:

答案 0 :(得分:2)

您的Element *newData没有Element类的实例,因此当您尝试访问newData指向的实例时,它会崩溃。

尝试将Element *newData;更改为Element *newData = new Element;

  • ps。:当你不再需要这个实例时,别忘了delete

答案 1 :(得分:1)

此方法正在写入未初始化的内存:

void ajoutListe(Item *data)
{
    Element *new;

    //set data
    new->setElement(data); // Right here, "new" is an uninitialized pointer

    //check if list is empty
    if( courant == NULL)
    {           
        //set current pointer
        courant = new;
    }
}

我很惊讶这个编译(是吗?)。这段代码也应该崩溃。

你得到的奇怪数字肯定是记忆的随机部分。您可能想要更多地考虑内存管理 - 这里存在许多问题。当调用ajoutListe时,为什么courant成员只有在为NULL时才会被设置?我们只是泄漏了新元素吗?我们如何实际遍历此列表?