在类本身中创建一个类的实例[重复]

Posted

技术标签:

【中文标题】在类本身中创建一个类的实例[重复]【英文标题】:Create an instance of a class in the class itself [duplicate] 【发布时间】:2014-10-23 12:56:33 【问题描述】:

我是 C++ 新手,有一个问题:

比较以下代码:

class Node  
public:
    int data;
    Node* x;
;

class Node  
public:
    int data;
    Node x;
;

我知道代码的第二部分无法通过编译。但我想知道原因。

是和内存分配有关还是只是语法规定?

如果有人能解决我的问题,我将不胜感激。

【问题讨论】:

编译器不必知道 Node 上的任何东西就能管理指向节点的指针。 至少部分与内存分配有关,因为Node实例的大小会因为递归而趋于无穷大。每个 Instance 将包含 Node 的所有变量以及 Node 的另一个实例,该实例将包含另一个 Instance,依此类推。最后构造不能被分配,因为它的大小是无限的。 但是指针呢?我认为第一种情况可以通过编译并正常工作。 @Oh2 可以。 (顺便说一句,如果您了解 Java:它或多或少等同于 Java 版本 class Node public int data; public Node x; ,因为在 Java 中,类类型的变量隐式只是指针。) 【参考方案1】:

如果可以,那么 Node 将包含 Node,其中包含 Node,其中包含 Node,其中包含 Node,其中包含 Node,其中包含Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个@ 987654334@,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个@987654341 @,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node ,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含一个Node,其中包含Node,其中包含 Node... 以此类推,直到宇宙充满 Nodes 并内爆。

【讨论】:

正确可视化问题 我一整天看到的最佳答案。 但是如果宇宙是无限的,怎么可能充满Nodes? (它是无限的吗?您需要在答案中详细说明。) 宇宙中同时充满了Nodes和一个 Node,这更可怕。 @TonyD 声明“我有鼻子”并没有因为我也有肚脐而被证伪。【参考方案2】:

您的第二个片段中的代码无法编译,因为在您声明其 Node 类型的数据成员 x 的位置未完全定义类 Node

为了便于理解,想象一下如果它可以编译,它会导致某种“无限递归结构”,这将占用无限量的内存。 这是此类对象的假设布局:


  data: int
  x: Node
  
    data: int
    x: Node
    
      data: int
      x: Node
      
        ...
      
    
  

第一种情况有效,因为您不需要完全定义一个类来声明指向它的指针。 我发现将“完全定义”视为“编译器知道这个类有多大”有助于推理这样的问题:编译器需要知道一个类有多大才能声明它的实例,而不是声明一个指向它的指针,无论类如何,它的大小都相同。

【讨论】:

但是指针呢?我认为第一种情况可以通过编译并正常工作。 已编辑答案以涵盖为什么它与指针一起使用 你不必知道一个对象的大小来创建一个指向它的指针,它只是一个地址,它不“包含”任何东西。【参考方案3】:

它更多地与基本逻辑有关。为了让Node 包含与自身大小相同的对象以及其他对象,它必须比自身大,或者无限大。

该语言也阻止了它,因为类型在它自己的定义中是不完整的(所以你甚至不能有一个包含自身的空类的退化情况)。但这对于更基本的逻辑不可能性来说是相当偶然的。

【讨论】:

【参考方案4】:

编译器在类 A 中找到 A 时需要知道 A 的完整类型。由于 A 不完整,它无法确定其大小,无法确定成员变量 a 将占用多少空间,因此它将不编译。

【讨论】:

【参考方案5】:

要解决此类问题,您还可以尝试前向声明。 但问题在于 Martin J 已经说过的话。

class Node;

class Node  
public:
    int data;
    Node* x;
;

请记住,这未经测试

【讨论】:

这不是必须的,当你声明一个指向Node的指针时,编译器已经知道它是一个类的名字,即使没有前向声明。 不知道你是否一直在关闭我的帖子。如果是,原因是什么?我已经声明它没有经过测试。 我做到了,因为我说过的话(你的答案虽然无害,但没有帮助,也没有对现有答案增加任何内容),部分原因是“未测试”:D。当您不知道它是否有效时,您不应该给出答案(尤其是对于如此简短且易于测试的答案)。 对不起,我真的不是故意无礼的。我对您的答案投反对票的原因是因为它没有回答问题并且不会帮助任何未来的读者(在您的示例中,前向声明在 OP 的问题 中完全没用)。您的示例仅因指针而起作用,可以删除前向声明。如果我冒犯了你,我真的很抱歉,这绝对不是这个简单的反对意见的重点。

以上是关于在类本身中创建一个类的实例[重复]的主要内容,如果未能解决你的问题,请参考以下文章

你如何在python中创建一个外部类的实例[重复]

在类中创建对象的最佳实践

python进阶三(面向对象编程基础)3-1 python中创建类属型

在类的函数中创建字符串时出错

访问Class中的常量而不在ObjectiveC中创建类的实例[重复]

如何在模板化类的私有部分中创建模板化结构