C++ 链表List Element class 头文件问题

C++ LinkedList ListElement class header file trouble

我是 C++ 的新手,因为我对学习这种语言非常感兴趣,所以我正在尝试将我的旧 Java 项目翻译成 C++。其中之一是基本的 LinkedList,它应该存储 class "ListElement" 的对象,其中包含 class "Table" 的对象(基本上是餐厅的表列表)。 到目前为止,我可以毫无错误地翻译 Table class。 一切都按规则进行(class 头文件中的声明 "Table.h",源代码文件中的实现 "Table.cpp")。在 main.cpp 中,我可以创建 Table 的实例,操作数据并将其打印出来。所以对我来说 Table class 似乎和 Java 一样有效。 当谈到 ListElement class 时,我在特定点上遇到了麻烦,我不知道我在 C++ 中做错了什么,因为在 Java 中它工作得很好。基本上这似乎是一个声明问题,老实说我无法弄清楚;所以这就是为什么我需要你的帮助。

这是我的 ListElement.h 的样子:

#ifndef ListElement_h
#define ListElement_h

#include "Table.h"

class ListElement{
private:
    Table value;
    ListElement next;
public:
    Table getValue();
    void setValue(Table value);
    ListElement getNext();
    void setNext(ListElement next);

    //Default-Constructor
    ListElement();
    //Custom-Constructor
    ListElement(Table value, ListElement next);
    //Destructor
    ~ListElement();
};

#endif /* ListElement_h */

有问题的部分似乎是这部分代码:

   ListElement next;

(我在 Mac OSX 上使用 XCode) 我的 IDE 给出了以下错误:“字段类型不完整 'ListElement'

我的ListElement.cpp看起来像这样:

#include "ListElement.h"
#include "Table.h"

ListElement::ListElement(Table value, ListElement next){

}
ListElement::ListElement(){

}
ListElement::~ListElement(){

}

在我的 ListElement.cpp 中,我在 IDE 中收到以下错误:“声明中的异常说明与先前的声明不匹配

在Java中我得到了这样的ListElement(基本上只有代码的重要部分):

public class ListElement {
    private Table value;
    private ListElement next;

而且效果很好。

我是不是遗漏了什么或者我做错了什么?

在java private ListElement 下;仅创建对另一个 ListElement 类型对象的引用。

但在C++中,情况并非如此。在每个 ListElement 类型的对象中,都会创建另一个 ListElement 类型的对象,从而创建无限递归。

您可以使用

创建指向另一个 ListElement 的指针
ListElement * next;

在Java中,每一个非原始变量实际上都是一个指针。因此它们可以是 null.

在 C++ 中,当您编写 ListElement next; 时,那不是指针。不可能是nullptr。因此你试图定义一个 infinitely 递归数据结构,因为 ListElement 包含一个 ListElement 包含一个 ListElement 包含一个 ListElement,其中包含一个……

这就是为什么您需要 next 成为一个 nullable/optional 值,例如指针。它作为递归的基本情况。

有关相关问题,请参阅