现在我使用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.
当您存储指向局部变量的指针并稍后取消引用这些指针时,代码中有许多未定义的行为.一旦声明的范围结束,就会破坏局部变量.
例:
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)