我对C ++很陌生,因为我对学习这门语言非常感兴趣,我试图将旧的Java项目翻译成C ++。其中一个是基本的LinkedList,它应该存储类" ListElement"的对象。包含类"表"的对象(基本上是餐馆的桌子清单)。 到目前为止,我可以翻译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;
它运作得很好。
我错过了什么或者我做错了什么?
答案 0 :(得分:1)
在java私有ListElement中;仅创建对ListElement类型的另一个对象的引用。
但在C ++中,情况并非如此。在ListElement类型的每个对象中,创建另一个ListElement类型的对象,从而创建无限递归。
您可以使用
创建指向另一个ListElement的指针ListElement * next;
答案 1 :(得分:0)
在Java中,每个非原始变量实际上都是一个指针。因此,它们可以是null
。
在C ++中,当你编写ListElement next;
时,那不是指针。它不能是nullptr
。因此,您尝试定义无限递归数据结构,因为ListElement
包含ListElement
,其中包含ListElement
,其中包含ListElement
,包含...
这就是您需要next
成为可空/可选值的原因,例如指针。它是递归的基础案例。
有关相关问题,请参阅Why do linked lists use pointers instead of storing nodes inside of nodes