对象的创建!(50分)

  • 主题发起人 主题发起人 corbaejb
  • 开始时间 开始时间
C

corbaejb

Unregistered / Unconfirmed
GUEST, unregistred user!
在delphi中对象的创建是否一定要用create动态创建!我自己创建了一个类,调用如下,运行
时出现存取错误:

unit Unit2;

interface
type
TMyClass = class
private
{ Private declarations }
public
{ Public declarations }
x :integer;
y :integer;
z :integer;
s :String;
constructor create;
procedure Add;
end;
implementation
constructor TMyClass.create;
begin
x:=0;
y:=0;
z:=0;
s:='';
end;
procedure TMyClass.Add;
begin
z:=x+y;
s:='success';
end;
end.

////
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses unit2;
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
testobj :TMyClass;
begin
testobj.x:=10;
testobj.y:=20;
testobj.Add;
ShowMessage(inttostr(testobj.z));
Showmessage(testobj.s);
end;

end.
 
对象和对象的实例不是一回事。对象只是一个类别,而实例是一个实在的内存空间。所以,
一定要有对象的实例。在C++Build中你就可看出二者的区别:所有的继承TObject的对象都是
一个指针,要使用对象的实例,一定要New一个。
 
加上testobj:=Tmyclass.create;
另外Tmyclass是类,testobj才是类的实例,即对象.对象必须调用类的构造函数来创建.
 
to wind_cloudy:

难道编译器不会自动调用构造函数吗?在C++中是自动调用的
 
除了在窗体上放置的控件,delphi不会自动调用构造函数
 
调用构造函数,delphi和c++不同,对象不能自己创建
testobj :=TMyClass.create
 
1.在类的Create过程的第一行之前添加:inherited;用于调用TObject的对象空间分配方法。
2.在使用对象之前,先用testobj:=TMyClass.create;给对象分配空间。
3.概念性错误:在Delphi中,你在程序中声明的“对象”实际上都只是指针,仅仅占有4Byte空间,
它的实例并不存在,因此,若要对一个对象进行任何操作,必须首先调用该对象的构造方法,使对象
获得实例(instance)空间,此后,“对象”占有的4Byte空间就指向了对象实例所在内存,针对对象的所有操作
实际上都被映射到实例内存区中去;而在C++中,是有“对象”以及“对象的指针”的区别的(所以
在C++中,很容易一不小心就生成了一个新的类的实例,而你的原意仅仅是用一个对象指针指向一个
已经存在的对象)。
 
必须要先实例化
 
以上各位大侠的意见都是很好的。
同意他们的说法。
 
一个继承类的构造函数中第一件要作的事就是调用基类的构造函数:
constructor TMyClass.Create(...);
begin
inherited Create(...)
// 如参数一致:inherited;就可以了
...
end;
 
同意楼上,你只是定义了一个类,并没有把该类实例化成一个对象!!
 
procedure TForm1.Button1Click(Sender: TObject);
var
testobj :TMyClass;
begin
testobj :=TMyClass.Create;
testobj.x:=10;
testobj.y:=20;
testobj.Add;
ShowMessage(inttostr(testobj.z));
Showmessage(testobj.s);
end;
 
找个老丈母娘先,然后才可能有对象。
:)
[:D]
 
后退
顶部