C ++中的类和对象新手

时间:2018-08-31 02:52:54

标签: c++ class object data-structures

我是C ++中的类和对象的新手。我不明白为什么未创建链接列表。它只是提示第一个值,然后崩溃。我无法弄清楚问题出在哪里,并且已经浪费了太多时间。最终决定获得一些帮助。感谢您的时间。

 #include <iostream>
 using namespace std;

 class Node{
 private:
     int data;
     Node* next;
     Node* previous;

 public:

     Node(int value){
        data = value;
        next = NULL;
        previous = NULL;
     }

     void setValue(int value)
     {
        data = value;
     }

     int getValue()
     {
         return data;
     }

     Node* getNext()
     {
         return next;
     }

     void setNext(Node* address)
     {
         next = address;
     }

     Node* getPrevious(){
        return previous;
     }

     void setPrevious(Node* address){
        previous = address;
     }

 };


class LinkedList{
private:
    Node* head;
    Node* tail;

public:

    LinkedList(){
        Node* head = NULL;
        Node* tail = NULL;
    }



    void createLinklist(){

        int n;
        cout << "Enter the number of nodes = ";
        cin >> n;



        for(int i=0;i<n;i++)
        {
            int value;
            cout << "Enter the value at " << i <<"=";
            cin >> value;

            Node* node = new Node(value);

            if(head == NULL)
            {
                head = node;
                tail = node;
            }
            else{
                insertAtEnd(node,tail);
            }

        }

    }


    void insertAtEnd(Node* newNode,Node* lastNode)
    {
        lastNode->setNext(newNode);
        newNode->setPrevious(lastNode);
        newNode->setNext(NULL);
        tail = newNode;


    }




    void display(){

    Node* start = head;

    while(start!=NULL)
    {
        cout << "Address=" << start << endl;
        cout << "value = " << start->getValue() << endl;
        cout << "Next = " <<  start->getNext() << endl;
        start = start->getNext();

    }

    }


};


 int main(){

    LinkedList newLink;
    newLink.createLinklist();
    newLink.display();

 }

3 个答案:

答案 0 :(得分:2)

问题

LinkedList(){
    Node* head = NULL;
    Node* tail = NULL;
}

Node* head = NULL;告诉编译器创建一个名为head的新自动变量,该变量是指向Node的指针,并将此新变量设置为NULL。这个新的head shadows LinkedList::head,将其替换为构造函数的其余部分。结果是head一个仅存在于构造函数主体中的变量,它获得了LinkedList::head专用的初始化(实际上是赋值)。

这意味着当您进入

if(head == NULL)

createLinklist中,LinkedList::head可能不是NULL,而是指向深蓝色的边界,因此程序执行

insertAtEnd(node,tail);

LinkedList::tail的命运与LinkedList::head相同,并且可能指向您无法安全书写的地方。该程序可能会在此时崩溃,但是它可能会覆盖其他重要内容,并导致该程序稍后崩溃,从而隐藏了错误的真实位置。

解决方案

LinkedList(){
    head = NULL;
    tail = NULL;
}

分配NULL toand尾巴。一种更惯用的方法是使用Member Initializer List

LinkedList(): head(NULL), tail(NULL)
{
    // does nothing.
}

侧注

一个好的警告级别的编译器会警告您

Node* head = NULL;

没有任何用处。永远不要忽略编译器警告。编译器警告表示,尽管您的程序在语法上可能是正确的,但它可能没有按照您的意愿执行。警告是您防范逻辑错误的第一道防线。始终尝试理解并解决编译器告诉您的内容。这样可以节省您以后的调试时间。

答案 1 :(得分:1)

问题是您的构造函数:

class LinkedList{
private:
    Node* head;
    Node* tail;

public:

    LinkedList(){
        Node* head = NULL;
        Node* tail = NULL;
    }

在构造函数中,您将两个LOCAL变量声明为NULL,而不是类中的变量。这意味着该类指向任何地方,但很可能不是NULL。

建议:学习C ++ 11或更高版本。

  • 使用类成员初始化。
  • 使用nullptr代替NULL
  • 避免使用new和delete。在处理指针时,默认情况下学习默认使用std :: unique_ptr,尽管我了解您想在此处学习处理指针的用例,而std :: unique_ptrs实际上不是链接列表节点的可行解决方案,因此,对于本用例,请忘记此建议,但是仍然要在想新东西时,总是问,我不应该使用std :: unique_ptr吗?

基本上C ++ 11允许您执行以下操作:

class LinkedList{
private:
    Node* head = nullptr;
    Node* tail = nullptr;

尽管您可以添加以下内容,但您并不需要构造函数,

LinkedList() = default;

如果要使用默认值。

答案 2 :(得分:0)

将代码更改为

    LinkedList(){
         head = NULL;
         tail = NULL;
    }

因为您已经定义了headtail