【问题标题】:How can I use a class before defining it?在定义类之前如何使用它?
【发布时间】:2011-02-23 16:38:07
【问题描述】:
class Node
{
    string name;
    Node previous;
};

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

我怎样才能让它在 C++ 中工作?它在 C# 中工作。

编辑:

为什么Node* previous 有效?

【问题讨论】:

  • 我按照大家的建议使用了指针。有用!但为什么呢?
  • 指针的大小是已知的。因为您是按值声明 Node,所以编译器需要知道要保留多少空间。但是该类仍在定义中,因此这是不可能的。
  • 在 C# 中,Node 类型的变量不是节点对象,而是对此类节点对象的引用。这种隐式间接在 C++ 中不存在。如果要在 C++ 中进行间接寻址,则必须显式使用指针。这是一个重要的区别,您必须了解这一点。

标签: c++ class pointers


【解决方案1】:

使用指针。 Node* previous; 可以解决问题。

正如你现在所做的那样,你实际上试图让你的班级无限大。

【讨论】:

    【解决方案2】:

    使用指针或引用。

    例如:

    Node* previous;
    

    唯一的限制是类不能有自己的实际字段,可能是出于构造原因。想一想,如果每个 Box 中都包含另一个 Box,你会如何得到有限数量的 Box?

    如果我没记错的话,C# 只使用类类型的引用(Java 也是如此),所以你在那里使用了一个引用,只是没有看到它。

    【讨论】:

      【解决方案3】:

      对于编辑,请考虑一下,您的 node 包含另一个 node ,其中包含另一个 node。所以你有一个无限序列的节点包含在另一个节点中。您想要的是指向存储下一个node 的位置的指针。所以你应该把它改成Node*

      【讨论】:

        【解决方案4】:

        在 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++ 代码。

        【讨论】:

        • 感谢您的详细解释。我正在重新学习C++,很久没用了:)
        【解决方案5】:

        想想“现实世界中”的汽车对象。它可以通过 VIN 号包含对另一个 Car 对象的引用。它甚至可以包含对自身的引用,或对 VIN 值 0(NULL 或 NO CAR)的引用。

        但是,如果您真的想在每个 Car 对象中添加另一个 Car OBJECT 怎么办?那将如何运作?包含 Car 对象将包含什么 Car 对象?

        Java 和 C# 实际上并没有将 THE OBJECT 放在包含的类中,而是对对象的 REFERENCE。像 C++ 这样的语言允许您指定类中是否包含一个 OBJECT、对类中包含的另一个 OBJECT 的 REFERENCE 或者甚至是指向类中包含的另一个 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
        };
        

        最终你会知道何时以及为什么要使用第一个、第二个或第三个,但这完全是一个不同的问题。

        【讨论】:

          【解决方案6】:

          Node不应该是指针吗?

          【讨论】:

            猜你喜欢
            • 2015-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-27
            • 2012-03-21
            • 2023-03-11
            • 2021-01-19
            • 2011-03-06
            相关资源
            最近更新 更多