структура не имеет члена с именем

0

Я пытаюсь сделать связанный список, который отслеживает количество узлов. Я создал статическую переменную numNodes которую я увеличиваю в конструкторе, и которую я пытаюсь deleteNode() функции deleteNode(). Однако я получаю следующую ошибку:

quest.cpp: In member function 'void List::deleteNode()':
quest.cpp:25: error: 'struct List::node' has no member named 'numNodes'

Это отлично работает с обычными переменными, но я не могу получить доступ к статическим. Я читаю здесь, что мне нужно объявить переменную с чем-то вроде

int node::numNodes = 0;

но вставка этого в программу дала мне другие ошибки.

На строке 6:

/tmp//ccrjmtbc.o: In function 'List::deleteNode()':
quest.cpp:(.text._ZN4List10deleteNodeEv[List::deleteNode()]+0xe): undefined reference to 'List::node::numNodes'
quest.cpp:(.text._ZN4List10deleteNodeEv[List::deleteNode()]+0x17): undefined reference to 'List::node::numNodes'
collect2: ld returned 1 exit status

На строке 29:

quest.cpp:29: error: type 'List::node' is not derived from type 'List'

На строке 32:

quest.cpp: At global scope:
quest.cpp:32: error: 'int List::node::numNodes' is not a static member of 'struct List::node'

Проблема заключается в том, что я не знаю, как получить доступ к статической переменной при ее инкапсуляции в другую структуру. Мне что-то не хватает? Есть лучший способ сделать это? Нужно ли объявлять переменную в файле заголовка? (Я прихожу к C++ с Java и не привык к таким вещам.)

Здесь код (лишенный ненужного беспорядка):

#include <cstdlib>

struct List {

    struct node {
//     static int numNodes;   //Didn't work
       node() {
            static int numNodes = 0;
            numNodes++;
       }
    };

    node* nodePtr;

    List() {
        nodePtr = NULL;
    }

    void addNode() {
       node* n = new node;
       nodePtr = n;
    }

    void deleteNode() {
        nodePtr->numNodes--;
        delete nodePtr;
    }

//   int node::numNodes = 0;    //Didn't work
};

//int List::node::numNodes = 0;     //Didn't work

int main() {
    List MyList;
    MyList.addNode();
    MyList.deleteNode();
}
  • 0
    numNodes не numNodes быть свойством всего списка, а не отдельного узла?
  • 0
    Любопытно - если вы пришли из Java, есть ли причина, по которой вы используете структуры, а не классы?
Показать ещё 8 комментариев
Теги:
linked-list
static-variables
static-members

1 ответ

0
Лучший ответ

Вот что вам нужно изменить, чтобы сделать эту работу:

  1. Раскомментировать статические int numNodes; линия вверху
  2. Удалить статические int numNodes = 0; в c'tor.
  3. Раскомментируйте свою нижнюю попытку, int List :: node :: numNodes = 0;
  4. Убедитесь, что инициализация завершается в файле cpp, а не в заголовке.

Тогда все будет хорошо. Одна нота, статические numNodes не будут служить какой-либо практической цели, кроме помощника по отладке. Если эта статика является основной частью вашего проекта, вы, вероятно, ошибетесь.

  • 0
    Большой! Это отвечает на вопрос и достигает ожидаемого результата: после создания и удаления узла numNodes = 0 . Я также думаю, что понимаю, почему мой код не работает сейчас. Не могли бы вы объяснить, что вы подразумеваете под "не будет служить никакой практической цели"? Кажется, что такого дизайна достаточно, например, чтобы предупредить меня, когда список достигнет определенного размера. Я полагаю, что могут быть и другие лучшие способы сделать это ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню