我有一个班级
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 是错误类型。在这种情况下我该怎么办?
答案 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()
PCB
到linklist
时,您正在制作整个PCB
的副本,包括其中包含的(不同的)linklist
。
我有一种感觉,你来自Java或C#,你假设事情是真的没有参考。您需要了解如何使用指针。
答案 3 :(得分:-1)
您可以使用前向声明:
class linklist; // forward declaration
class PCB {
public:
struct {
string type;
linklist list; //refer to list which contains PCB instance
} status;
}
或者当您仅通过引用或指针引用类型时,您不需要包含它的头文件。
linklist* list