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; 

ここで、次のように「new」を使用して CustomParam へのポインターを作成しようとします。

var pointerToCustomParam: pCustomParam; 
begin
new(pointerToCustomParam);

ただし、CustomParam クラスのコンストラクターにはジャンプしません。次のようにコンストラクターを手動で呼び出す場合:

pointerToCustomParam^.create; 

アプリケーションは SetLength コマンドでクラッシュします。

私が気づいたのは、変数「pointerToCustomParam」が「新しい」関数の直後にごみのコンテンツを取得したことです。

あなたが私を助けることができ、情報が十分であることを願っています:)

ありがとうございました :)

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 = CustomParam

pCustomParam を CustomParam への POINTER ではなく、CustomParam 型として定義します。

したがってpointerToCustomParam、POINTER ではなく、CustomParam になります。したがって、「ごみの内容」

試す

pCustomParam = ^CustomParam;

于 2013-03-19T12:40:58.710 に答える