面向对象的问题,一个对象私有变量是另外一个对象时,怎么传值啊(50分)

  • 主题发起人 主题发起人 xgwzw
  • 开始时间 开始时间
X

xgwzw

Unregistered / Unconfirmed
GUEST, unregistred user!
请问改怎么写才对啊,谢谢
type
mclass=class
private
x:TStrings;
y:Integer;
public
constructor create(flst:TStrings);
destructor Destroy
override;

end;

type
test1=class

private
fm:mclass;
z:Integer;
public
destructor Destroy
override;
constructor create(am:mclass);
procedure show;

end;


constructor mclass.create(flst: TStrings);
begin
flst:=TStringList.Create;
// flst.Add('A');
// flst.Add('B');
// flst.Add('C');
end;

destructor mclass.Destroy;
begin
Free(x);
inherited;
end;

{ test1 }

constructor test1.create(am: mclass);
begin
fm:=am;
end;

destructor test1.Destroy;
begin
FreeAndNil(fm);
inherited;
end;

procedure test1.show;
var
__i:Integer;
begin
for __i:=0 to fm.x.Count-1 do//出错
ShowMessage(fm.x.Strings[__i]);

end;



procedure TForm1.btn2Click(Sender: TObject);
var
x:mclass;
m:TStrings;
b1:test1;
begin
m:=TStringList.Create;
m.Add('1');
m.Add('2');
m.Add('3');
x:=mclass.create(m);
b1:=b1.create(x);
b1.show;//出错处
end;
 
服了you了
b1:=b1.create(x);//出错处
这种写法,你发明的?改如下
b1:=test1.create(x);
 
to foxphone2003
改正后,报错处为b1.show;x的域值tstring类型的值怎么没有被传到Test1的对象b1中,不能显示出来啊,好像为nil,怎么传递啊
 
procedure TForm1.btn2Click(Sender: TObject);
var
x:mclass;
m:TStrings;
b1:test1;
begin
m:=TStringList.Create;
m.Add('1');
m.Add('2');
m.Add('3');
x:=mclass.create(m);

b1:=b1.create(x);//出错处
b1.show;


end;


如果没有猜错的呀

m 是一个局部变量,出了btn2Click(Sender: TObject);的范围就不在存在了
所以值是传不过去的
你可以改一下

constructor test1.create(am: mclass);
begin
//fm:=mclass.create

fm:=am;//出错
end;

本想帮你改改,但你写的这个。。。。哎,你自己写吧,建一个 FM ,不要 fm:=am
这样 fm 和 am 一样, am 没了, fm 当然也就没有了
 
constructor mclass.create(flst: TStrings);
begin
flst:=TStringList.Create;
end;
问题出在这里,你根本没给x.x赋值,改为:
constructor mclass.create(flst: TStrings);
begin
x:=flst;
end;
楼上的建议也很重要,如果b1是全局变量,在别处调用b1.show就可能会出问题
 
现在我重新改过后,释放类时,内存报错
type

t=class
private
f:TStrings;
n:Integer;
public
destructor destroy;override;
constructor create(af: TStrings
an: Integer);

end;


type
test=class
private
ft:t;
fy:Integer;
public
destructor destroy;override;
constructor create(am: t
an: Integer);
end;

constructor t.create(af:TStrings;an:Integer);
begin
n:=an;
f:=TStringList.Create;
if Assigned(af) then
f.Assign(af)
else
f:=nil;
end;



destructor t.destroy;
begin
if Assigned(f) then
FreeAndNil(f);
inherited;
end;


constructor test.create(am: T
an: Integer);
begin
fy:=an;
ft:=am;//我认为这里不能这样传递,但是不知道怎么用assign这个函数引用对象
end;


destructor test.destroy;
begin
if Assigned(ft) then
FreeAndNil(ft);//单步出错处
inherited;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
jj:test;
yy:t;
begin
yy:=t.create(lst2.Items,124);
jj:=test.create(yy,23);
ShowMessage(jj.ft.f.CommaText);

if Assigned(jj.ft.f) then
ShowMessage('TRUE');
ShowMessage(jj.ft.f.CommaText);
yy.Free;
jj.Free;//报内存出错处,请问该怎么写啊,这种类组合方式的释放,

ShowMessage('True2');

end;
 
destructor t.destroy;
begin
if Assigned(f) then
FreeAndNil(f);
inherited;
end;

用 f.free 试试呢
 
to qi_jianzhou
还是不行
 
type
mclass=class
private
x:TStrings;
y:Integer;
public
constructor create(flst:TStrings);
destructor Destroy
override;
perpeoty XX: Tstrings read x;
end;

type
test1=class
private
fm:mclass;
z:Integer;
public
destructor Destroy
override;
constructor create(am:mclass);
procedure show;
end;
constructor mclass.create(flst: TStrings);
begin
x:= flst;
end;

destructor mclass.Destroy;
begin
FreeAndNil(x);
inherited;
end;

{ test1 }

constructor test1.create(am: mclass);
begin
fm:=am;
end;

destructor test1.Destroy;
begin
FreeAndNil(fm);
inherited;
end;

procedure test1.show;
var
__i:Integer;
begin
for __i:=0 to fm.xx.Count-1 do //x是私有变量, 不能这样访问,得变成公共得属性。
ShowMessage(fm.xx.Strings[__i]);
end;
procedure TForm1.btn2Click(Sender: TObject);
var
x:mclass;
m:TStrings;
b1:test1;
begin
m:=TStringList.Create;
m.Add('1');
m.Add('2');
m.Add('3');
x:=mclass.create(m);
b1:=test1.create(x);
b1.show;//出错处
end;
 
Assigned是判定当前对象是否为Nil.
要注意 TStingList对象,其Object为指针.
举例说明:
A,B : TStringList
A := B;
FreeAndNil(A)
//此时B已经被释放,但B<>nil
A =nil;
如果再释放B就会出错.
FreeAndNil(B)
//Error!!!! 应该用 B := nil;
 
to zsy146, 谢谢,你上面说的我知道了,
怎么写下面的ft:=am ,即ft不是赋值对象,而是引用对象

constructor test.create(am: T
an: Integer);
begin
fy:=an;
ft:=am;//我认为错在这里,不能这样传递,但是不知道怎么用assign这个函数引用对象
end;
 
把里面的一个一个的传
fy.x := an.x;
fy.y := an.y;

前提是 fy 已经创建

另外建议一下,看看怎么写规范的代码,你的代码太乱了
 
fy 已经创建
还是不行
 
搞不明白你要干什么
总感到你的类定义不好用,还是重定义一下吧
 
我是想将一个类作为参数,传递给另外一个类,
即使t作为参数传递给test类,
 
ft:=am;//我认为这里不能这样传递,但是不知道怎么用assign这个函数引用对象
修改下面的形式就可以了:
ft:=t.create(am.f,am.n);

我调试是所有语句执行之后才出错的,
if Assigned(ft) then
FreeAndNil(ft);//单步出错处
这句会把Form1释放掉,不清楚原因.
 
to wrl_001
谢谢 就是这条语句,搞定
 
接受答案了.
 
后退
顶部