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 值,例如指针。它作为递归的基本情况。
有关相关问题,请参阅
我是 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 值,例如指针。它作为递归的基本情况。
有关相关问题,请参阅