【问题标题】:Create new Pointer to Class创建指向类的新指针
【发布时间】:2013-03-19 11:48:59
【问题描述】:

我想创建一个指向名为“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”函数之后直接得到了垃圾内容。

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

谢谢你:)

【问题讨论】:

    标签: delphi class pointers pascal


    【解决方案1】:

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

    var
      Param: CustomParam;
    
    Param := CustomParam.Create;
    

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

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

    type
      PCustomParam = ^CustomParam;
    

    然后声明一个变量:

    var
      Param: PCustomParam;
    

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

    New(Param);
    

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

    Param^ := CustomParam.Create;
    

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

    【讨论】:

    • 值得注意的是,只是为了说教,对于一般情况,像这样的指针的迂回是完全没有必要的,而且,如果我猜的话,将 C/C++ 设计模式印到delphi 是无效的。当然,对象指针有有效的用例,但我在开头问题的上下文中看不到它。如果只是需要创建一个对象并将其分配给一个变量或字段,那么直接的方法就足够了,而且我认为是首选。
    【解决方案2】:

    你的问题是你的声明

    pCustomParam = 自定义参数

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

    因此pointerToCustomParam 将不是一个指针,而是一个 CustomParam - 因此是“垃圾内容”

    试试

    pCustomParam = ^CustomParam;

    【讨论】:

    • 抱歉,xD 打错了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多