class Node
{
string name;
Node previous;
};
Error: Node::previous uses "Node" which is being defined.
如何在C ++中使用它?它适用于C#。
修改
为什么Node* previous
有效?
答案 0 :(得分:10)
使用指针。 Node* previous;
可以解决问题。
正如你现在所做的那样,你实际上试图让你的课程无限大。
答案 1 :(得分:8)
使用指针或引用。
例如:
Node* previous;
唯一的限制是,一个类不能拥有自己的实际字段,可能是出于施工原因。想一想,如果每个Box里面都包含另一个Box,你最终会得到有限数量的盒子吗?
如果我没有弄错,C#只使用类类型的引用(就像Java一样),所以你在那里使用引用,只是没有看到它。
答案 2 :(得分:5)
对于编辑,请考虑一下,您的node
包含另一个node
,其中包含另一个node
。所以你有一个无限的节点序列包含在一起。你想要的是指向下一个Node*
存储位置的指针。因此,您应将其更改为{{1}}。
答案 3 :(得分:2)
在C#中,声明previous
之类的内容会为您提供参考。在C ++中,声明previous
之类的内容会为您提供一个嵌入在类Node
的每个对象中的对象。
对象不能以递归方式嵌入其中嵌入了同一类的对象。 previous.name
必须存在(并且存储分配给它),就像previous.previous.name
一样,等等,只需要一次内存分配。 Node
对象的大小必须至少与string
对象的大小加上Node
对象的大小一样多(自string
以来这是不可能的大于0字节)。和其他这样的矛盾。
正如其他人所说,使用指针:Node *previous
或引用Node &previous
。或者std::deque<std::string>
; - )
您可能想知道C ++与C#的不同之处在于,如果您尝试通过移植C#代码来编写单链表,那将会破坏您的一天。例如,没有垃圾收集。如果不了解C ++对象模型,就无法编写正确的C ++代码。
答案 4 :(得分:2)
想想“在现实世界中”的Car对象。它可以通过VIN编号包含对另一个Car对象的引用。它甚至可以包含对自身的引用,或者包含VIN值0(NULL或NO CAR)。
但是如果你真的想在每个Car Object中都想要另一个Car OBJECT呢?那会怎么样?包含Car对象的Car对象包含什么?
Java和C#实际上并没有将OBJECT放在包含的类中,而是放在对象的REFERENCE中。像C ++这样的语言允许您指定类中是否包含OBJECT,类中包含的另一个OBJECT的参考,甚至包含在类中的另一个OBJECT的指针:
class Car
{
Engine engine; // Car CONTAINS an Engine object
};
class Car
{
Engine &engine; // Car contains a REFERENCE to an Engine object
};
class Car
{
Engine *pEngine; // Car contains a POINTER to an Engine object
};
最终,你会知道何时以及为何使用第一个,第二个或第三个,但这完全是另一个问题。
答案 5 :(得分:1)
Node不应该是指针吗?