在定义类之前如何使用类?

时间:2010-05-25 13:04:32

标签: c++ class pointers

class Node
{
    string name;
    Node previous;
};

 Error: Node::previous uses "Node" which is being defined.

如何在C ++中使用它?它适用于C#。

修改

为什么Node* previous有效?

6 个答案:

答案 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不应该是指针吗?