我对C++很陌生,因为我对学习这种语言很感兴趣,所以我正试图将我以前的Java项目翻译成C++。其中之一是基本的LinkedList,它应该存储类"ListElement"的对象,其中包含类"Table"的对象(基本上是餐厅的表列表)。到目前为止,我可以在没有任何错误的情况下翻译Table类。一切按规则进行(头文件"Table.h"中的类声明,源代码文件"Table.cpp"中的实现)。在main.cpp中,我可以创建Table的实例,处理数据并将其打印出来。所以对我来说,Table类的工作原理和Java一样。当谈到ListElement类时,我在特定的点上遇到了问题,我不知道我在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私有ListElement next中;仅创建对ListElement类型的另一个对象的引用。
但在C++中,情况并非如此。在每个类型为ListElement的对象中,都会创建另一个类型为ListElement的对象,从而创建一个无限递归。
您可以使用创建指向另一个ListElement的指针
ListElement * next;
在Java中,每个非基元变量实际上都是一个指针。因此它们可以是CCD_ 1。
在C++中,当您编写ListElement next;
时,它不是指针。不可能是nullptr
。因此,您试图定义一个无限递归数据结构,因为ListElement
包含一个ListElement
,它包含一个包含ListElement
的ListElement
,它包含…
这就是为什么您需要next
是一个可以为null/可选的值,例如一个指针。它是递归的基本情况。
有关相关问题,请参阅为什么链表使用指针而不是将节点存储在节点内