2017-01-29 13 views
4

У меня есть назначение, где я должен создавать методы для вставки и удаления узлов в двусвязном списке. Однако я немного ржавый с моим C++. Я получаю сообщение об ошибке от своих передних и задних указателей.Проблема с узлами и связанными списками

LinkedList.h

#ifndef LinkedList_h 
#define LinkedList_h 

#include <iostream> 

using namespace std; 

struct node { 
    node * prev; 
    int data; 
    node * next; 

}; 

class LinkedList { 

private: 
    //pointers to point to front and end of Linked List 
    static node * front; //the error is coming from here 
    static node * rear; //the error is coming from here 
public: 
    static void insert_front(int data); 
}; 
#endif 

LinkedList.cpp

#include "LinkedList.h" 

//insert int to front 
void LinkedList::insert_front(int data) { 

    node *q = nullptr; 
    //If the list is empty 
    if (front == nullptr && rear == nullptr) { 
     q = new node; 
     q->prev = nullptr; 
     q->data = data; 
     q->next = nullptr; 
     front = q; 
     rear = q; 
     q = nullptr; 
    } 
    //If there is only one node in list 
    //... 
    //If there are at least 2 nodes in list 
    //... 

} 

Ошибки я получаю являются:

unresolved external symbol "private: static struct node * LinkedList::front ([email protected]@@[email protected]@A) 


unresolved external symbol "private: static struct node * LinkedList::rear ([email protected]@@[email protected]@A) 

если удалить статические из частных переменных когда я Разностные их в файле CPP я получаю «нестатический контрольный элемент должен быть по отношению к конкретному объекту»

ответ

9

Вы внесли front и rear членов static. Это означает, что есть только один экземпляр этих членов для всех экземпляров класса LinkedList.

Если это то, что вы хотите, то вам нужно объявить их в файле .cpp, как это было предложено @Soeren:

node* LinkedList::front = nullptr; 
node* LinkedList::read = nullptr; 

Однако то, что вы, вероятно, хотите, чтобы иметь возможность создавать несколько LinkedList с, и отслеживать front и rear каждого. Если это так, то вы должны сделать эти члены не статическими (а также сделать insert_front() нестационарными).

Причина ошибки, когда вы делаете это потому, что вам нужно создать экземпляр класса для того, чтобы использовать его:

LinkedList list; 
list.insert_front(5); 
6

Вы должны инициализировать статические переменные в файле CPP:

node* LinkedList::front = nullptr; 
node* LinkedList::rear = nullptr; 

Мы можем только назвать статический класс членов класса, а не на объект класса. И это возможно, даже если ни один экземпляр не существует. Вот почему каждый статический член-экземпляр должен быть инициализировать, как правило, в файле cpp.

И из-за статической переменной инициализируется вне области видимости класса, мы должны вызвать переменную по полному имени (например, LinkedList :: front).