使用推送和弹出操作将Node添加到列表的普通类。
class listthis
{
private:
struct Node {
Node* next;
int value;
};
Node* begin = nullptr;
public:
listthis(){
Node newnode = Node();
begin = &newnode;
}
void push(const int value){
begin->value = value;
begin->next = begin;
}
当main函数调用pop时,为什么cout
打印错误?
弹出功能
int pop(){
std::cout<<begin->value<<"\n";
std::cout<<begin->value<<"\n";
std::cout<<begin->value<<"\n";
std::cout<<begin->value<<"\n";
std::cout<<begin->value<<"\n";
int value = begin->value;
begin->next = nullptr;
return value;
}
};
主要功能
int main(int argc, const char * argv[]) {
listthis t = listthis();
t.push(1);
t.pop();
return 0;
}
输出:
1
1
1
1
1952932600
1952932600
答案 0 :(得分:0)
此构造函数
listthis(){
Node newnode = Node();
begin = &newnode;
}
已经错误并且具有未定义的行为,因为数据成员begin被分配了具有自动存储持续时间的本地可变新节点的地址。退出构造函数后,指针的值变为无效,因为局部变量不会处于活动状态,并且可能会覆盖由它占用的内存。
如果构造函数和成员函数push看起来像
,那么逻辑上会更一致 listthis() = default;
void push( int value )
{
begin = new Node { begin, value };
}
考虑到
void push( const int value );
和
void push( int value );
声明相同的一个函数,尽管函数的定义可以取决于参数的限定符。
答案 1 :(得分:0)
您可以将构造函数更改为此类内容;
listthis()
{
begin = new Node();
}
你的全班看起来像这样;
class listthis
{
private:
struct Node {
Node* next;
int value;
};
Node* begin;
public:
listthis()
{
begin = new Node();
}
void push(const int value){
begin->value = value;
begin->next = begin;
}
int pop(){
std::cout<<begin->value<<"\n";
std::cout<<begin->value<<"\n";
std::cout<<begin->value<<"\n";
std::cout<<begin->value<<"\n";
std::cout<<begin->value<<"\n";
int value = begin->value;
begin->next = nullptr;
return value;
}
};
希望这有帮助。
答案 2 :(得分:0)
正确的构造函数是:
listthis(){
Node newnode = Node();
begin = &newnode;
begin->next = &newnode + sizeof(Node);
}
正确的推动是
void push(const T value){
begin->next = begin + sizeof(Node);
begin = begin->next;
begin->value = value;
}
但我的问题是为什么pop print错误或“value”的值不同?