从TQueue继承 ,生成string的队列,push,pop,peek 方法应该如何写???(50分)

  • 主题发起人 主题发起人 shadow_x
  • 开始时间 开始时间
S

shadow_x

Unregistered / Unconfirmed
GUEST, unregistred user!
TStringQueue= class(TQueue)
function Push(AString: string): TObject;
function Pop: string;
function Peek: string;
end;

function TStringQueue.Peek: string;
begin
Result := string(inherited Peek);
end;

function TStringQueue.Pop: string;
begin
Result := string(inherited Pop);
end;

function TStringQueue.Push(AString: string): TObject;
begin
Result := TObject(inherited Push( AString ));
end;
=========================================
qs:TStringQueue;
str:String;

qs:=TStringQueue.create;
qs.push('sdfsd');
showmessage(qs.pop);//不报错,正确运行

//-----
str:='sdfsd';
qs:=TStringQueue.create;
qs.push(str);
showmessage(qs.pop);//报错,是指针错误。

为什么?
 
你的程序编译错误(D7)
function TStringQueue.Push(AString: string): TObject;
begin
Result := TObject(inherited Push( AString ))

//Incompatible types: 'string' and 'pointer'
end;
如果是
function TStringQueue.Push(AString: string): TObject;
begin
Result := TObject(inherited Push(PChar (AString) ))

end;
则可以编译通过,但问题出来了
因为TQueue只管理了指针,你的TStringQueue继承自TQueue,带来了下面问题
qs:=TStringQueue.create;
qs.push('sdfsd')

showmessage(qs.pop);//不报错,正确运行
push调用的是 TQueue.push( pointer ),因为使用了串常量,放在全局内存中,所以pop能够得到内容

str:='sdfsd';
qs:=TStringQueue.create;
qs.push(str);
showmessage(qs.pop);//报错,是指针错误。
在使用qs.pop是 str 可能已经无效了,所以指针错误

不知分析得对否,仅供参考


 
agang_yao
还有一个帖子没人回复,您去领分吧

http://www.delphibbs.com/delphibbs/dispq.asp?lid=2077234
 
接受答案了.
 
后退
顶部