为什么"a-> content"给我一个地址而不是一个值?

Tir*_*ous 0 c++ pointers

现在我使用gm:s引擎制作了几年的游戏(我向你保证我不会使用拖放的新手,就像往常一样),我决定开始学习使用c ++本身,你知道扩展我的知识和所有好东西= D.

在这样做时,我一直在尝试将列表类作为练习项目,你知道,有一组节点链接在一起,然后循环抛出这些节点来获取索引的值,这里是我的代码,我因为代码有一个我很难理解的重大问题

template<class type>
class ListNode
{
    public:
        type content;
        ListNode<type>* next;
        ListNode<type>* prev;
        ListNode(type content) : content(content), next(NULL), prev(NULL) {}
    protected:
    private:
};
template<class type>
class List
{
    public:
        List() : SIZE(0), start(NULL), last(NULL) {}
        unsigned int Add(type value)
        {
            if (this->SIZE == 0)
            {
                ListNode<type> a(value);
                this->start = &a;
                this->last = &a;
            }
            else
            {
                ListNode<type> a(value);
                this->last->next = &a;
                a.prev = this->last;
                this->last = &a;
            }
            this->SIZE++;
            return (this->SIZE - 1);
        }
        type Find(unsigned int pos)
        {
            ListNode<type>* a = this->start;
            for(unsigned int i = 0; i<this->SIZE; i++)
            {
                if (i < pos)
                {
                    a = a->next;
                    continue;
                }
                else
                {
                    return (*a).content;
                }
                continue;
            }
        }
    protected:
    private:
        unsigned int SIZE;
        ListNode<type>* start;
        ListNode<type>* last;
};
Run Code Online (Sandbox Code Playgroud)

无论如何,至少对我而言,这段代码看起来很好,并且它的工作原理是我能够创建一个新的列表而不会崩溃,并且能够将元素添加到此列表中,并从中返回这些元素的正确索引但是,除了从列表本身获取元素的值时出现问题,就像我运行下面的测试代码时,它没有给我提供给我的是什么

List<int> a;
unsigned int b = a.Add(313);
unsigned int c = a.Add(433);
print<unsigned int>(b);
print<int>(a.Find(b));
print<unsigned int>(c);
print<int>(a.Find(c));
Run Code Online (Sandbox Code Playgroud)

现在这个代码我希望能给我

0
313
1
433
Run Code Online (Sandbox Code Playgroud)

然而,正如所说的那样,只有一半是这样做的,给了我

0
2686684
1
2686584
Run Code Online (Sandbox Code Playgroud)

现在,这个我迷路了,我假设提供的值是某种指针地址,但我根本不明白那些意图是什么,或者是什么导致价值成为那个,或者为什么

因此我问互联网,wtf导致这些值被给出,因为我在这一点上很困惑

我很抱歉,如果这有点漫长而漫无目的,我倾向于经常写这些东西= D.

谢谢= D.

Som*_*ude 8

当您存储指向局部变量的指针并稍后取消引用这些指针时,代码中有许多未定义的行为.一旦声明的范围结束,就会破坏局部变量.

例:

if (this->SIZE == 0)
{
    ListNode<type> a(value);
    this->start = &a;
    this->last = &a;
}
Run Code Online (Sandbox Code Playgroud)

一旦达到关闭支撑,则if身体的范围结束,并且变量a被破坏.指向此变量的指针现在是一个所谓的杂散指针,以任何方式使用它将导致未定义的行为.

解决方案是使用new以下方法动态分配对象:

auto* a = new ListNode<type>(value);
Run Code Online (Sandbox Code Playgroud)

或者,如果您没有支持C++ 11的编译器

ListNode<type>* a = new ListNode<type>(value);
Run Code Online (Sandbox Code Playgroud)