类变量赋值问题(50分)

  • 主题发起人 主题发起人 Gooder
  • 开始时间 开始时间
G

Gooder

Unregistered / Unconfirmed
GUEST, unregistred user!
type MyClass=class
public
a:Integer;
end;

A、B:MyClass;
A:=MyClass.Create;
A.a:=1;
B:=MyClass.Create;
B:=A;
B.a:=5;
为什么运行后A.a也会变成5,如果想B:=A后,B和A完全独立,应该如何?
 
type MyClass=class
public
a:Integer;
end;

A、B:MyClass;
A:=MyClass.Create;
A.a:=1;
B:=MyClass.Create;
B:=A
//B引用A,也就是说,A和B都指向了一个地质
B.a:=5;

type MyClass=class
public
a:Integer;
end;

A、B:MyClass;
A:=MyClass.Create;
A.a:=1;
B:=MyClass.Create;
B:=A;
B.a:=5;
A.a:=1
//从新对A赋值


 
b:=a后,a和b指向同一地址,操作b等于是操作a。
可以用a.assgin(b)
用“对象赋值”在大富翁中搜一下,可以查到相关信息。
 
如果就是这个简单的类的话,简单:
type
MyClass=class
public
a:Integer;
end;

var
x, y: MyClass;
Size: Integer;
begin
x := NewClass.Create;
x.i := 15;
Size := x.InstanceSize;
y := NewClass(x.NewInstance);
Move(Pointer(x)^, Pointer(y)^, Size);
ShowMessage('Y.i: ' + IntToStr(y.i));
y.i := 17;
ShowMessage('X.i: ' + IntToStr(x.i))
// 仍然是 15,因此互不影响
y.Free;
x.Free;
end;

当然了,要是你这个类中间还包括诸如 对象啦、长字符串啦、指针啦什么的,就不能
这样做了。那些东西是需要额外分配空间的。要是那样反正我想不出简单的办法:(

 
B:=A.clone
B.a:=5
 
多人接受答案了。
 
后退
顶部