2012-03-23 73 views
0

我想定义常量与记录,其中一个变量是类。 和接收错误: [DCC错误] usample.pas(18):E2026常量表达式预期通过类记录

类和记录声明在1单元

type TParentClass = class (TObject) 
function Call(s: string) : boolean; 
end; 

type TMyRecord = record 
s: string; 
c: TParentClass; //or TClass 
end; 

而且UNIT2与子类并记录:

type TChildClass = class (TParentClass); 
procedure two; 

var: 
    class_var: TChildClass; 

const 
rec_var : array[0..1] of TMyRecord = (
    (s : ''; c : class_var) //Error with class_var. 
); 

UPD:我想填写Class中的记录和本类中的unit1搜索功能。它是一个团队项目。

UPD2:

const 
    class_var: TChildClass = nil; 

同样的错误。

+3

这根本无法完成。一个常量只能包含常量。 – 2012-03-23 20:26:04

+0

你想做什么?在哪里设置'class_var'? – 2012-03-23 20:31:33

回答

2

因为编译器说,你必须在那里放一个常量,但是你将class_var定义为一个变量。

将class_var更改为声明为常量而非变量。

但这不能真正做到:

const 
    class_var = TParentClass; 

是不允许的。

而且

const 
    class_var : TClass = TParentClass; 

是不是一个真正的不断,你不能使用它的另一个不变的声明中。

+0

@Françoisvar: const class_var:TChildClass = nil; 同样的错误。 – 2012-03-23 20:39:38

+0

@МиколаРоманюк,看我的更新。你需要一个**“真实”**常数。 – 2012-03-23 20:47:58

+0

@Françoisvar:那么我可以尝试在Class常量的类之间使用指针吗? – 2012-03-23 22:25:37

0

您无法定义一个具有初始化为变量内容的字段的常量。编译器需要在编译时评估const,即当class_var甚至没有位置时,不要介意任何内容。

忘记这个想法。如果可以,将rec_var声明为变量并在运行时加载它。

2

在你最新的更新你问为什么,这并不编译:

const 
    class_var: TChildClass = nil; 

rec_var: TMyRecord = (s: ''; c: class_var); 

无法编译是class_var不是true constant的原因。你可以这样写:

rec_var: TMyRecord = (s: ''; c: nil); 

因为nil是一个真正的常数。

我竭力要得到你真正想要做一个把手,但我的直觉告诉我,一个不变的是不是你所需要的。我认为你将需要使用在启动时初始化的变量。

+0

是的,它的工作,但我需要改变无创建类变量,它需要函数,也必须传递给记录。 – 2012-03-23 22:29:28

+0

我不明白。 – 2012-03-23 22:34:49

+0

我想op意味着,指针可以是const,所以类指针不会改变,但是类本身可能会改变。 – none 2012-03-25 14:10:47