你好,我想创建列表结构,但我不想使用结构,但我想使用对象。我是新来的,当我做这段代码时,它不起作用了。
#include<stdlib.h>
#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
class List {
public:
int id;
List* next = NULL;
List* prev = NULL;;
static List create(int value, int id = 0){
List list;
list.value = value;
list.next = NULL;
list.prev = NULL;
list.id = id;
return list;
}
void add(int value){
this->next = &List::create(value, this->id + 1);
}
void show(){
cout << "#" << this->id << endl << " " << this->value << endl;
if (this->next != NULL){
cout << (*this->next).id;
}
else{
cout << "NE ESTAS";
}
}
protected:
int value;
};
int main(void){
cout << "Hello, It's a simple Object Lists program" << endl << endl;
List head = List::create(1);
head.add(2);
head.show();
getch();
return 0;
}当我尝试检查list.next地址时,create()方法和show()中的地址是相等的,但是值是不同的。我做错了什么?
发布于 2015-10-12 21:43:11
下面一行的问题是,您没有真正创建一个新项。您只需返回一个List,并将其复制到head:
List head = List::create(1);类似地,当您add()到head时,下面的行将返回一个临时List对象。在next中,您使用这个临时地址:
this->next = &List::create(value, this->id + 1);不幸的是,这个临时对象随后被销毁(当您离开语句时)。因此,一旦添加完成,next就指向一个已经无效的对象。
然后调用show()时,当您试图显示next的内容时(因为它指向一个不再存在的对象),您会得到一个未定义的行为。
关于可能的解决方案的一些提示:
最简单的方法是使用std::list..。但我想,您想要创建自己的List,以了解这是如何工作的。
由于您的目的是以面向对象的方式工作,您应该考虑使用构造函数而不是静态创建函数:
List (int value, int id = 0) : value(value),
id(id), next(nullptr), prev (nullptr) {
}可以像这样创建add函数:
void add(int value){
next = new List (value, id + 1); // dynamic allocation
next->prev = this;
}当然,这只是个开始。有几件事你需要做:
发布于 2015-10-12 21:35:19
这里,
void add(int value){
this->next = &List::create(value, this->id + 1);
}您正在存储临时对象的地址。当函数返回时,this->next是一个悬空指针。
您需要使用动态内存分配对象,并将其分配给this->next。
void add(int value){
List* ptr = new List;
ptr->value = value;
ptr->next = NULL;
ptr->prev = NULL;
ptr->id = this->id + 1;
// Establish the pointer links between this and ptr
List* next = this->next;
this->next = ptr;
ptr->prev = this;
ptr->next = next;
if ( next != NULL )
{
next->prev = ptr;
}
}发布于 2015-10-12 21:39:28
问题在于您的创建功能:
static List create(int value, int id = 0){
List list;
list.value = value;
list.next = NULL;
list.prev = NULL;
list.id = id;
return list;
}对象list被分配到堆栈上(作为自动变量),因此将在函数返回时立即销毁。因此,当函数返回时,您的返回对象已经死了,并且没有定义。
顺便说一句:类名List是用词不当。您最好称它为Node,因为它只代表一个列表的一个节点。列表本身需要一个单独的类,这个类应该称为List。
还有一些函数是不完整的(add和show),但是您可能知道这一点。
https://stackoverflow.com/questions/33090482
复制相似问题