Я пытаюсь сделать связанный список, который отслеживает количество узлов. Я создал статическую переменную 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();
}
Вот что вам нужно изменить, чтобы сделать эту работу:
Тогда все будет хорошо. Одна нота, статические numNodes не будут служить какой-либо практической цели, кроме помощника по отладке. Если эта статика является основной частью вашего проекта, вы, вероятно, ошибетесь.
numNodes = 0
. Я также думаю, что понимаю, почему мой код не работает сейчас. Не могли бы вы объяснить, что вы подразумеваете под "не будет служить никакой практической цели"? Кажется, что такого дизайна достаточно, например, чтобы предупредить меня, когда список достигнет определенного размера. Я полагаю, что могут быть и другие лучшие способы сделать это ...
numNodes
неnumNodes
быть свойством всего списка, а не отдельного узла?