我想创建一个名为“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;
现在我尝试用“new”创建指向CustomParam的指针,如下所示:
var pointerToCustomParam: pCustomParam;
begin
new(pointerToCustomParam);
但它不会跳转到CustomParam类的构造函数。如果我手动调用构造函数,如下所示:
pointerToCustomParam^.create;
应用程序将在SetLength命令中崩溃。
我注意到,变量“pointerToCustomParam”在“new”函数之后直接得到了垃圾内容。
我希望你能够帮助我,而且信息已经足够了:)。
谢谢:)
答案 0 :(得分:9)
创建类型实例的正确方法是在类型上调用构造函数并将结果赋值给该类型的变量:
var
Param: CustomParam;
Param := CustomParam.Create;
以这种方式创建的实例已经是引用,因此很少需要额外的指针。
如果你真的必须有一个指针,那么首先声明类型:
type
PCustomParam = ^CustomParam;
然后声明一个变量:
var
Param: PCustomParam;
为所指向的事物的内容分配内存:
New(Param);
这不一定为它指向的CustomParam引用赋予有效值,但如果确实如此,则赋值为nil。最后,为新分配的内存分配一个值:
Param^ := CustomParam.Create;
注意我们仍然必须调用构造函数,并且我们永远不会在我们正在创建的对象上调用构造函数,因为在调用构造函数之后该对象才会存在。
答案 1 :(得分:0)
你的问题是你的声明
pCustomParam = CustomParam
将pCustomParam定义为CustomParam类型,而不是Customparam的POINTER。
因此pointerToCustomParam
不会是一个指针,而是一个CustomParam - 因此'垃圾内容'
尝试
pCustomParam = ^ CustomParam;