c ++类互相引用

时间:2012-03-26 23:45:40

标签: c++ class

我有一个班级

class PCB {
     public: 
     struct {
         string type;
         **linklist list;**//refer to list which contains PCB instance
     } status;
}

我想要的是创建类PCB实例,但实例位于链接列表中。我建立了如下链接列表

class linklist
{

   public:

     void append( PCB num );
};
void linklist::append(PCB num){
}

错误,上面的 num 是错误类型。在这种情况下我该怎么办?

4 个答案:

答案 0 :(得分:1)

如果您不需要linklist::append方法中的副本,也可以使用(const)参考

void append(const PCB& num);

并在同一个头文件中转发声明PCB

class PCB;

答案 1 :(得分:0)

你可以对其中一种类型进行前瞻声明,但你真的应该问问自己为什么这样做。

我想不出任何时候这都是个好主意。如果您考虑相对于现实世界的问题,链接列表是一组存储桶。您要求的是用于容纳一系列(链接列表)铲斗(PCB)的铲斗(PCB)。实际上,这将永远不会起作用,因为铲斗不能容纳相同尺寸的其他铲斗的集合。

另一个想法是问自己,当STL(标准模板库)提供您需要的所有内容时,为什么会使用链接列表。如果你列出的PCB是相当静态的,我会强烈推荐一个矢量,如果没有,我会强烈推荐一个列表。

链接列表对于轻量级容器非常有效,但您必须维护它们。如果您使用类,请使用STL容器。

答案 2 :(得分:-1)

在定义另一个类之前,您需要向前声明每个类。在定义PCB的标头中,写

class linklist;
在定义PCB之前

,在定义linklist的标题中,写

class PCB;
linklist的定义之前

。这样,当编译器遇到每个类定义时,它会知道“其他”类的名称是有效的,并且让你声明指向它的指针,即使它还没有完全定义。

编辑抱歉,我刚注意到您的linklist::append函数实际上需要PCB个实例,而不是指针。在这种情况下,您需要确保在PCB之前定义linklist类,但仍需要在linklist之前转发声明PCB,以便您可以指定它。代码的顺序应为:

class linklist;

class PCB {
  // involves pointers to linklist
;

class linklist {
  // holds instances of PCB
};

再次编辑:我误读了您的**linklist list作为指向linklist的指针(即使它在语法上是错误的)。

您需要做的是:

  • 转发声明PCB,以便linklist的定义可以在方法签名中引用它。
  • 定义linklist类,但不定义其append函数。
  • 定义PCB类,该类可以包含linklist的实例,因为该类现已完全定义。
  • 定义linklist::append()函数,该函数可以采用PCB的实例,因为该类现已完全定义。

这将使你的代码得到编译,但它不会做你想要的那样,因为你定义类的方式没有多大意义。您的PCB类没有“引用”列表,包含列表。由于list成员变量不是指针,因此每个PCB实例都包含整个linklist 。当您append() PCBlinklist时,您正在制作整个PCB的副本,包括其中包含的(不同的)linklist

我有一种感觉,你来自Java或C#,你假设事情是真的没有参考。您需要了解如何使用指针。

答案 3 :(得分:-1)

  1. 您可以使用前向声明:

    class linklist; // forward declaration
    
    class PCB {
    
      public:
         struct {
            string type;
            linklist list;  //refer to list which contains PCB instance
        } status;
    }
    
  2. 或者当您仅通过引用或指针引用类型时,您不需要包含它的头文件。

    linklist* list