【问题标题】:List on C++ objectC++ 对象列表
【发布时间】:2016-01-10 11:37:46
【问题描述】:

您好,我想创建列表结构,但我不想使用结构,但我想使用对象。我是新手,当我执行此代码时它不起作用。

#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() 中是否相等但值不同时。我做错了什么?

【问题讨论】:

    标签: c++ list oop object


    【解决方案1】:

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

    List head = List::create(1);
    

    同样地,当你 add() 指向头部时,下面的行将返回一个临时的 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) {
        }
    

    添加函数可以这样创建:

        void add(int value){
            next = new List (value, id + 1);   // dynamic allocation
            next->prev = this;  
        }
    

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

    • 创建一个析构函数。主要问题是:你想只销毁一个列表,还是要销毁它的追随者?
    • 创建一个复制构造函数(为了复制 List 元素并避免浅拷贝)
    • 创建赋值运算符(同上,因为规则3)

    【讨论】:

      【解决方案2】:

      问题在于您的创建功能:

         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),但你可能知道。

      【讨论】:

        【解决方案3】:

        这里,

        void add(int value){
            this->next = &List::create(value, this->id + 1);
        }
        

        您正在存储临时对象的地址。 this-&gt;next 是函数返回时的悬空指针。

        您需要使用动态内存分配一个对象并将其分配给this-&gt;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;
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 2019-04-13
          • 1970-01-01
          • 1970-01-01
          • 2019-02-11
          • 2019-04-26
          • 2015-07-13
          • 2017-11-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多