首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++对象列表

C++对象列表
EN

Stack Overflow用户
提问于 2015-10-12 21:25:05
回答 3查看 63关注 0票数 2

你好,我想创建列表结构,但我不想使用结构,但我想使用对象。我是新来的,当我做这段代码时,它不起作用了。

代码语言:javascript
复制
#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()中的地址是相等的,但是值是不同的。我做错了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-12 21:43:11

下面一行的问题是,您没有真正创建一个新项。您只需返回一个List,并将其复制到head:

代码语言:javascript
复制
List head = List::create(1);

类似地,当您add()到head时,下面的行将返回一个临时List对象。在next中,您使用这个临时地址:

代码语言:javascript
复制
this->next = &List::create(value, this->id + 1);

不幸的是,这个临时对象随后被销毁(当您离开语句时)。因此,一旦添加完成,next就指向一个已经无效的对象。

然后调用show()时,当您试图显示next的内容时(因为它指向一个不再存在的对象),您会得到一个未定义的行为。

关于可能的解决方案的一些提示:

最简单的方法是使用std::list..。但我想,您想要创建自己的List,以了解这是如何工作的。

由于您的目的是以面向对象的方式工作,您应该考虑使用构造函数而不是静态创建函数:

代码语言:javascript
复制
    List (int value, int id = 0) : value(value), 
             id(id), next(nullptr), prev (nullptr) {
    }

可以像这样创建add函数:

代码语言:javascript
复制
    void add(int value){
        next = new List (value, id + 1);   // dynamic allocation
        next->prev = this;  
    }

当然,这只是个开始。有几件事你需要做:

  • 创建一个析构函数。主要的问题是:你是只想摧毁一个列表,还是想要摧毁它的追随者?
  • 创建副本构造函数(以复制列表元素并避免浅层副本)
  • 创建赋值操作符(与上面相同,因为第3条规则)
票数 1
EN

Stack Overflow用户

发布于 2015-10-12 21:35:19

这里,

代码语言:javascript
复制
void add(int value){
    this->next = &List::create(value, this->id + 1);
}

您正在存储临时对象的地址。当函数返回时,this->next是一个悬空指针。

您需要使用动态内存分配对象,并将其分配给this->next

代码语言:javascript
复制
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;
    }

}
票数 1
EN

Stack Overflow用户

发布于 2015-10-12 21:39:28

问题在于您的创建功能:

代码语言:javascript
复制
   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

还有一些函数是不完整的(addshow),但是您可能知道这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33090482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档