C++ 为什么我的C++;程序编译后是否停止工作?
我是一名计算机科学专业的学生,在过去的一年里一直在用Java编程。现在我对学习C++感兴趣。第一个我想用C++编码的程序是使用链表的栈的实现,我在使用java之前已经对它进行了编码。我几乎不知道我在做什么,基本上只是写我认为正确的东西,直到我没有编译错误。所以我最终做到了,我的程序没有编译错误,但当我运行它时,一个弹出窗口显示我的“Stack.exe已停止工作” 这是我的密码:`C++ 为什么我的C++;程序编译后是否停止工作?,c++,C++,我是一名计算机科学专业的学生,在过去的一年里一直在用Java编程。现在我对学习C++感兴趣。第一个我想用C++编码的程序是使用链表的栈的实现,我在使用java之前已经对它进行了编码。我几乎不知道我在做什么,基本上只是写我认为正确的东西,直到我没有编译错误。所以我最终做到了,我的程序没有编译错误,但当我运行它时,一个弹出窗口显示我的“Stack.exe已停止工作” 这是我的密码:` #include <iostream> using namespace std; class Sta
#include <iostream>
using namespace std;
class Stack;
class Node;
class Node
{
public:
string element;
Node *next;
Node(string, Node);
};
Node::Node(string element, Node next)
{
this -> element = element;
*(this -> next) = next;
}
class Stack
{
private:
Node *tos;
public:
Stack()
{
tos = NULL;
}
void push(string str)
{
tos = new Node(str, *tos);
}
string peek()
{
return tos->element;
}
string pop()
{
string temp = tos->element;
tos = (tos->next);
return temp;
}
};
int main(void)
{
Stack bob;
bob.push("Wow");
bob.push("Wiw");
cout << bob.peek();
return 0;
}
#包括
使用名称空间std;
类堆栈;
类节点;
类节点
{
公众:
字符串元素;
节点*下一步;
节点(字符串,节点);
};
节点::节点(字符串元素,节点下一个)
{
这个->元素=元素;
*(这个->下一个)=下一个;
}
类堆栈
{
私人:
节点*tos;
公众:
堆栈()
{
tos=NULL;
}
空推(字符串str)
{
tos=新节点(str,*tos);
}
字符串peek()
{
返回tos->element;
}
字符串pop()
{
字符串temp=tos->element;
tos=(tos->next);
返回温度;
}
};
内部主(空)
{
堆栈bob;
鲍勃。推(“哇”);
鲍勃。推(“Wiw”);
cout您在几个地方取消了对空指针或未定义指针的引用。首先让我们看看您的节点
构造函数:
*(this -> next) = next;
由于next
尚未定义,取消引用它会导致未定义的行为。实际上,next
将指向内存中可能不属于您的某个随机位置,因此写入它将导致程序崩溃。您的节点构造函数应将指向节点的指针作为其第二个参数不是按值获取节点
:
Node::Node(string element, Node* next)
: element{element},
next{next}
{}
注意,我还初始化了节点的成员,而不是默认地初始化它们,然后在构造函数的主体中分配给它们
在修复节点的构造函数之后,还需要修复堆栈::push
以传递指针而不是对象:
void push(string str)
{
tos = new Node(str, tos);
}
请注意,即使修复了崩溃问题,当从堆栈中弹出时(或当堆栈被销毁时),仍会泄漏内存你需要<代码>删除<代码>任何你的代码>新的< /代码>,或者更好地使用<代码> STD::SyrdYPPTR < /C> >而不是原始<代码>节点*< /C> > /S> < /P> C++中的对象以完全不同于java的方式工作。在爪哇中,很多方法都没有等价的。这里是其中之一。你需要退一步,从开始就开始学习C++。在代码中有很多问题。不解释对象如何在C++中工作,这是不可能的,这是整个书的主题,而不是StAccOffl的简短的400个字符注释。对不起,其中一个问题是:C++有一个<代码>删除>代码,而不是一个内置的垃圾收集器。你需要使用它。这里的问题不是缺少<代码>删除>代码>语句,而是对类和类实例(A.K.Abjts)的根本理解缺乏。在C++中工作。显示构造函数的第一件事就是取消引用未初始化的指针。Kaboom。未定义的行为。显然是因为“this -> Next=Next;没有编译,OP发现在它前面粘贴一个解引用操作符会使它编译,所以这一定是正确的做法,完全忽略了一个痛苦的事实,即构造函数的参数显然应该是指针,等等等等……我这样做是因为我用Java就是这样做的。--不要使用Java作为编写C++代码的模型,这是灾难的处方。