关于类的一个函数中参数为这个类的一个实例的问题(50分)

  • 主题发起人 主题发起人 南京男生
  • 开始时间 开始时间

南京男生

Unregistered / Unconfirmed
GUEST, unregistred user!
TMyNode = class (TObject)
private
FHead:PNode;
FNext:Pnode;
Public
property Head: PNode read FHead write SetHead default nil;
property Next: PNode read FNext write SetNext default nil;
procedure InsertAfterMe(MyPoint:TMyNode);
end;


procedure TMyNode.InsertAfterMe(MyPoint:TMyNode);
begin

FHead:=PNode(self);
*
FHead:=PNode(MyPoint);
*
MyPoint.Next:=FNext;
^
........
end;

程序中我是这样调用的:
a:TMyNode;
b:TMyNode;
a.InsertAfterMe(b)
在编译时能通过,但在运行时,打*的句子都会出错,提示access出错,write的地址不对;打^的句子可以执行
请问各位大侠:
我若想实现以上思路,请问我该怎样修改InsertAfterMe(MyPoint:TMyNode)函数?或者是InsertAfterMe()
不能作为类封装的函数?
多谢!
 
拜托个位大侠了
 
这有什么难的?
procedure TMyNode.InsertAfterMe(MyPoint:TMyNode);
begin

FHead:=PNode(self);
* //这一句强制转换,编译器是无法发现错误的!
FHead:=PNode(MyPoint);
* // 同上
MyPoint.Next:=FNext;
^
........
end;

我不知道你 PNode 是什么东西,将自身转换成这个样子,看不懂你的意图。
要知道:强类型语言并不禁止强制转换,强制转换是无类型判断的,如果类
型错,运行时必然错!
如果真要这样,可以改成:FHead := Self as PNode,如果这一句通过(FHead <> nil),
那么是其它错误,否则,就是类型不配!
 
to 楼上兄弟:
不好意思,没有写详细:
PNode=^TMyNode;
//指向TMyNode类型的指针
用Self as PNode不行,编译通不过。
FHead:=PNode(self);
* //这一句强制转换,
这一句是将本身的首地址赋给自己的一个首指针FHead .
请你再帮我诊断诊断。
 
拜托各位,分数不够可以再加的。
 
老兄,你的PNode是什么啊!是不是PNode=^TMyNode啊!!
你是不是想建一个链表啊!那就简单了啊!你只要把FNext指向下一个TMyNode类型的数据就行了!
a:TMyNode;
b:TMyNode;
a.FNext:=@b;
 
这不过是一个简单的链表的创建,怎么定义得这么罗嗦?
TMyNode = class;
TMyNode = class (TObject)
private
FPrev:TMyNode ;
FNext:TMyNode ;
Public
property Head: PNode read FHead write SetHead default nil;
property Next: PNode read FNext write SetNext default nil;
procedure InsertAfterMe(MyPoint:TMyNode);
property Prev: TMyNode read FPrev wrtie FPrev;
property Next: TMyNode read FNext write FNext;
end;
初始化的时候 FPrev := nil;
FNext := nil;
判断时,如果 FPrev 为 nil,
表示无父,即为根点;如果 FNext 为 nil 表示无子,为终叶结点。
不要死啃代码,看看你的算法是否正确,最简单的双向线性表的建立,多看看
《数据结构》吧...
 
to hjb_dydd兄:
如果InsertAfterMe()不作为类的方法,放在外头作为一个单独函数,将你的方法修改一下就
ok,但现在是作为类的一个方法的实现问题。
 
to 黑天大侠:确实是链表的创建,但我用你的方法好像仍然不行,在运行还是会出错,
我用的环境是Delphi7+windows2000 professional .麻烦你能否做个最简单的例子试试,
我由于赶工期,只能先把这个函数先放外头了。
关键看这句怎么改 FHead:=PNode(MyPoint);
*
感谢关注,先把几块大洋现上,谢谢。
 
多人接受答案了。
 
后退
顶部