我有两个班,一个子班:
type MyChildClass = class
public
parent: ^MyParent;
end;
和一个父类:
type MyParentClass = class
public
childs: array of ^MyChildClass;
end;
但是,由于只有上一个类声明了最后一个才知道另一个,所以这是行不通的。示例:
program Test;
interface
type MyChildClass = class
public
parent: ^MyParentClass;
end;
type MyParentClass = class
public
childs: array of ^MyChildClass;
end;
implementation
end.
这不会编译,因为第7行会按预期抛出错误“未声明的标识符'MyParentClass'。使用抽象类只能部分解决问题。我真的在寻找解决方案上很挣扎。也许使用接口会有所帮助?
答案 0 :(得分:3)
Pascal是一种经过pass编译的语言,因此编译器只扫描一个文件一次:在每一次必须知道每个标识符的情况下。在创建循环引用时(例如在这种情况下),您引用的是当前不允许的,写在之后的类。要解决此问题,您需要使用所谓的 forward声明,即您向编译器声明(很有希望)在代码中的某个地方它将找到该标识符(请查看代码 problem1 )。
此外,您正在定义多个不同的类型范围(通过多次写入 type )。每个类型作用域都有自己的类型(并且一个作用域中定义的类型不能被另一个作用域看到),因此,您需要定义一个类型(请查看代码 problem2 )。>
program Test;
interface
type // declare a single type scope (problem 2)
MyParentClass = class; // this is the forward declaration (problem 1)
MyChildClass = class
public
parent: ^MyParentClass;
end;
MyParentClass = class
public
childs: array of ^MyChildClass;
end;
implementation
end.
答案 1 :(得分:-1)
program Test;
interface
type
MyParentClass = class;
MyChildClass = class
public
parent: ^MyParentClass;
end;
MyParentClass = class
public
childs: array of ^MyChildClass;
end;
implementation
end.