Код |
TSampleType = (stNone,...);
TSample = class private FContent:string; FSType:TSampleType; ... public property Content:string read FContent; property SType:TSampleType read FSType; end;
TSampleArray = array of TSample;
TSampleList = class private FFields:TSampleArray; FCount:integer; function GetFields(i: integer): TSample; ....
public property Count:integer read FCount; property Fields[i:integer]:TSample read GetFields;default; end;
TSampleStack = class private FStack:TSampleList; FCount:integer; public function Push(Sample:TSample):integer;overload; function Pop:TToken; .... end;
..........
implementation
function TSampleList.Last: TSample; begin result:=FFields[FCount-1]; end;
procedure TSampleList.Delete(Index: integer); begin dec(FCount); FreeAndNil(FFields[Index]); if Index<FCount then move(FFields[Index+1],FFields[Index],(FCount-Index)*sizeof(TSample)); SetLength(FFields,FCount); end;
function TSampleStack.Pop: TSample; begin if FStack.Count>0 then begin result:=FStack.Last; // возвращаем ссылку на последний элемент массива FStack FStack.Delete(FStack.Count-1); // а потом его же и удаляем, то есть по сути вернется nil :( dec(FCount); end end;
.....
procedure TForm1.Button1Click(Sender: TObject); begin stack:=TSampleStack.Create; stack.Push('test',stNone); form1.Caption:=stack.Pop.Content; // access violation..., насколько я понял, потому что объект уже удален. end;
|
я не могу понять, как организовать метод Pop для стека с объектами классов. если методом Pop возвращать ссылку на объект, то вернется nil если в Pop предварительно копировать возвращаемый объект и возвращать уже копию, то как потом ее удалить?
Код | function TSampleStack.Pop: TSample; var Sample:TSample; begin if FStack.Count>0 then begin Sample:=TSample.Create; Sample.Content:=FStack.Last.Content; Sample.SType:=FStack.Last.SType; result:=Sample;// так все вернется нормально, но произойдет утечка памяти, так как объект Sample не удаляется FStack.Delete(FStack.Count-1); dec(FCount); end end;
|
|