我有一个任务,我应该创建在双向链表中插入和删除节点的方法。但是我的C ++有点生疏。 我的前后指针出错了。
LinkedList.h
unresolved external symbol "private: static struct node * LinkedList::front (?front@LinkedList@@0PAUnode@@A)
unresolved external symbol "private: static struct node * LinkedList::rear (?rear@LinkedList@@0PAUnode@@A)
LinkedList.cpp
{{1}}
我得到的错误是:
{{1}}
如果我在cpp文件中引用静态时从私有变量中删除静态,我得到"非静态成员引用必须相对于特定对象"
答案 0 :(得分: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);
答案 1 :(得分:6)
您必须初始化cpp文件中的静态变量:
node* LinkedList::front = nullptr;
node* LinkedList::rear = nullptr;
我们只能在类上调用静态类成员,而不能在类的对象上调用。即使没有实例,这也是可能的。这就是为什么每个静态成员实例必须初始化的原因,通常是在cpp文件中。
由于静态变量在类范围外初始化,我们必须通过全名调用变量(例如LinkedList :: front)。