使用struct作为私有成员在链接列表类中定义ListNode

Using struct as private member to define ListNode within link list class

本文关键字:列表 链接 ListNode 定义 成员 struct 使用      更新时间:2023-10-16

我试图用一个结构作为我的私有成员来实现一个LinkList类,但是,当我试图在LinkList.ccp下定义结构ListNode时,编译器说没有定义指针。错误出现在高亮线路上

#ifndef LINKLIST_H
#define LINKLIST_H
#include <iostream>
using namespace std;
template <typename T>
class LinkList{
private:
    struct ListNode{
        T item;
        ListNode * next;
    };
    int size; // the size of the listNodes.
    ListNode* _head;
public:
    LinkList(); // constructor
    void giveup(int n);
    bool isEmpty();
    int getLength();
    ListNode * find(int index);
};
#endif
#include "LinkList.h"
template <typename T>
LinkList<T>::LinkList(){
    _head = NULL;
    size = 0;
}
template <typename T>
void LinkList<T>::giveup(int n){
    cout << "The error " << n << " has occured" << endl;
}
template <typename T>
bool LinkList<T>::isEmpty(){
    return (size == 0);
}
template <typename T>
int LinkList<T>::getLength(){
    return size;
}
template <typename T>
***ListNode * LinkList<T>::find(int index){ // pointer not defined***
    if(index < 1 || index > size){
        return NULL;
    }
    ListNode * currentNode = _head;
    for(int pos =2; pos <=index; pos++){
        currentNode = currentNode->next;
    }
    return currentNode;
}

在类外的成员函数定义中,前导返回类型的作用域不在类内,因此如果它是嵌套类型,则必须对其进行限定:

template <typename T>
LinkList<T>::ListNode * LinkList<T>::find(int index)
^^^^^^^^^^^^^

参数列表和任何尾随的返回类型都在类中起作用,因此(在C++11中或更高版本中)您可以将其写为

template <typename T>
auto LinkList<T>::find(int index) -> ListNode *

一旦解决了这个问题,那么为了使用模板,您需要将函数定义移动到头文件中,如下所述。