2

我想创建一个指向名为“CustomParam”的类的指针,所以我声明

pCustomParam = ^CustomParam

类 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”函数之后直接得到了垃圾内容。

我希望你能帮助我并且信息足够了:)

谢谢 :)

4

2 回答 2

9

创建类型实例的正确方法是调用该类型的构造函数并将结果分配给该类型的变量:

var
  Param: CustomParam;

Param := CustomParam.Create;

以这种方式创建的实例已经是引用,因此很少需要额外的指针。

如果你真的必须有一个指针,那么首先声明类型:

type
  PCustomParam = ^CustomParam;

然后声明一个变量:

var
  Param: PCustomParam;

为它指向的事物的内容分配内存:

New(Param);

这不一定为它指向的 CustomParam 引用分配一个有效值,但如果是这样,则分配值 nil。最后,为新分配的内存分配一个值:

Param^ := CustomParam.Create;

请注意我们仍然必须调用构造函数,并且我们永远不会在我们正在创建的对象上调用构造函数,因为在调用构造函数之前该对象不存在。

于 2013-03-19T12:00:18.720 回答
0

你的问题是你的声明

pCustomParam = 自定义参数

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

因此pointerToCustomParam不会是 POINTER,而是 CustomParam - 因此是“垃圾内容”

尝试

pCustomParam = ^CustomParam;

于 2013-03-19T12:40:58.710 回答