Статический связанный список

Нужно создать класс со статическим связанным списком. Создаю статический указатель на начало списка, потом при использовании выдает ошибку: скрин При перемещении в public та же ошибка. Код:

#include <iostream>
using namespace std;
struct Node{
    int data;
    Node *next;
};

class Ship{

protected:
    int a = 15;
    int b;
private:
    static Node *head;
public:
    Ship(){
        cout << "q i'm ship\n";
        head = nullptr;
    };
    void addNode(int d){
        Node *nd = new Node; //динамически создаем новый узел
        nd->data = d;        //задаем узлу данные
        nd->next = NULL;     //новый узел в конце, поэтому NULL
        if(head == NULL)     //если создаем первый узел
            head = nd;
        else                 //если узел уже не первый
          {
            Node *current = head;
            //ищем в цикле предшествующий последнему узел
            while(current->next != NULL)
               current = current->next;
            //предшествующий указывает на последний
            current->next = nd;
           }
    };
    static void printList()
        {
            Node *current = head;
            while(current != NULL)
            {
                cout << current->data << endl;
                current = current->next;
            }
        }

};

class Parohod : public Ship{

public:
    Parohod(){
        cout << "q i'm parohod\n";
    };
    static void pisful(){
        cout << "pisful";
    }
};

class Parysnick : public Ship{

public:
    Parysnick(){
        cout << "q i'm parysnick\n" << a << endl;
    };
};

class Corvet : public Ship{

public:
    Corvet(){
        cout << "q i'm corvet\n";
    };
};

int main(){
    Parohod par;
    par.addNode(5);
    par.addNode(11);
    Parohod::printList();
    Parohod::pisful();
    return 0;
}


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

static внутри класса декларирует статический член, а ещё его нужно определить вне класса. Таким образом вы выделяете под него память. Подробности тут: static members.

// обычно в заголовочном файле ship.h
class Ship {
    static Node *head;
};

// обычно в файле реализации ship.cpp
Node *Ship::head = nullptr;

Вот полный пример. Ответ на вопрос тут: Node *List::head = nullptr;:

#include <iostream>

struct Node {
    int data;
    Node *next;
};

struct List {
    static Node *head;
    static void add(int data) {
        Node **node;
        for (node = &head; *node != nullptr; node = &((*node)->next)) {
        }
        *node = new Node({data, nullptr});
    }
    static void print() {
        for (Node *node = head; node != nullptr; node = node->next) {
            std::cout << node->data << '\n';
        }
    }
};

Node *List::head = nullptr;

int main() {
    List::add(1);
    List::add(2);
    List::add(42);
    List::print();
}
→ Ссылка