2013-03-19 79 views
2

我想创建一个指向名为“CustomParam”类,所以我宣布创建新指针到

pCustomParam = ^CustomParam 

的Class CustomParam有下列类变量,应在构造函数中设置为0:

var keyArray: array of String; 
var valueArray: array of String; 
var paramArray: array of pCustomParam; 
var isParamArray: array of Boolean; 
var size: Integer; 

的构造看起来像这样:

constructor CustomParam.create; 
begin 
    inherited; 
    size:= 0; 
    SetLength(keyArray,0); 
    SetLength(valueArray,0); 
    SetLength(isParamArray,0); 
    SetLength(paramArray,0); 
end; 

,并宣称这样的:

constructor create; overload; 

现在我尝试用“新”之类下面创建指针CustomParam:

var pointerToCustomParam: pCustomParam; 
begin 
new(pointerToCustomParam); 

但不要妄下CustomParam类的构造函数。如果我像下面这样手动调用构造函数:

pointerToCustomParam^.create; 

该应用程序将在SetLength命令上崩溃。

我注意到,变量“pointerToCustomParam”在“new”函数后直接得到了垃圾内容。

我希望你能帮助我和信息足够:)

谢谢:)

回答

8

正确的方式来创建一个类型的实例是调用类型的构造和结果分配给该类型的变量:

var 
    Param: CustomParam; 

Param := CustomParam.Create; 

实例创建的方式已经引用,所以有很少需要额外的指针。

如果你真的必须有一个指针,然后通过声明的类型入手:

type 
    PCustomParam = ^CustomParam; 

然后声明一个变量:

var 
    Param: PCustomParam; 

分配内存为它指向的东西的内容:

New(Param); 

这并不一定分配一个有效的值给CustomParam引用它poi nts到,但如果是,则赋值为零。所以最后,值分配到新分配的内存:

Param^ := CustomParam.Create; 

注意我们还是要调用构造函数,我们从来没有叫我们正在创建的对象的构造函数,因为对象不存在直到调用构造函数之后。

+4

值得注意,只是要说教,与这样的指针的操作现场,对于一般情况下,完全没有必要的,并且如果我猜想,对症的压印C/C++设计模式到的Delphi这是无效的。有,当然,有效的使用情况为对象的指针,但我没有看到它在开放问题的情况下。如果一个只需要创建一个对象,并将其分配给一个变量或字段,则直接的方法是足够的和优选的,我想。 – 2013-03-19 12:06:23

0

你的问题是,你的宣言

pCustomParam = CustomParam

定义pCustomParam为类型CustomParam,而不是一个指针Customparam的。

因此pointerToCustomParam将不会是一个POINTER,但CustomParam - 因此 '垃圾内容'

尝试

pCustomParam =^CustomParam;

+0

对不起,这是一个错误输入的xD – 2013-03-19 12:52:20