在类中创建对象的问题

时间:2022-08-30 10:37:18
定义一个类,
type
Tlf = class(Tfilestream)
  a:string;
  b:integer;
  fz:Tfilestream;
end;

然后写一个函数
function getsb():integer;
obj:Tlf;
begin
obj.a:='abc.dat';
obj.fz:=TFileStream.Create(obj.a, fmOpenRead or fmShareExclusive);
...
obj.fz.Free;
end;
打开和程序结束的时候会报 "Access Violation...."这个错误,这是为何?是TFileStream.Create需要重载吗??正确写法是什么?

28 个解决方案

#1



type
Tlf = class(Tfilestream)
  a:string;
  b:integer;
end;

然后写一个函数
function getsb():integer;
obj:Tlf;
begin
obj := TFileStream.Create(obj.a, fmOpenRead or fmShareExclusive);
obj.a:='abc.dat';
...
obj.Free;
end;

#2


obj := TFileStream.Create(obj.a, fmOpenRead or fmShareExclusive);
这句报错

#3


没看清楚,参数不能用obj.a,因为obj还没创建

你还是先整理清楚自己的思路吧,总体来说对象没创建是不能使用的,我建议你先复习下对象的知识,因为我看你思路比较乱,继承FileStream,又声明个FileStream的属性。

#4


这样试试。
function getsb():integer;
  obj:Tlf;
  a : string;
  begin
     a := 'abc.dat';    
    obj := TFileStream.Create( a, fmOpenRead or fmShareExclusive);
    obj.a:='abc.dat';
    ...
    obj.Free;
  end;

#5


我目的是想吧Tfilestream 所需的参数和获取的值还有Tfilestream封装到一个类里面进行操作

#6


加上 obj:=Tlf.create

#7


不能创建

#8


我觉得是一个派生类里面使用祖类的函数之后在销毁的时候可能越界吧?应当重载祖类的函数在派生类中????求解啊!!!

#9


引用 8 楼 walllacecn 的回复:
我觉得是一个派生类里面使用祖类的函数之后在销毁的时候可能越界吧?应当重载祖类的函数在派生类中????求解啊!!!

你的说法是错的,这是为什么让你去再看看相关知识的原因。

你的错误很简单,都说了你没给obj实例化,你又怎么可以调用obj下面的属性呢?你以为给obj下的属性实例化,就是给obj实例化么?

#10


楼上的你在D7里面运行一下看看是否能调用。。。

#11


引用 10 楼 walllacecn 的回复:
楼上的你在D7里面运行一下看看是否能调用。。。

你的程序是错的当然不能运行啊

#12


你真试了吗?读写都是正常的拜托!

#13


引用 12 楼 walllacecn 的回复:
你真试了吗?读写都是正常的拜托!

那是刚好凑巧碰到能访问进去的情况而已,但是当出现凑巧的时候,就出错了。当你看过Inside VCL这本书之后,你就知道为什么了。

#14


但是当出现凑巧的时候 -> 但是当出现“不”凑巧的时候

#15


定义个变量用来创建这个Tlf 
不知道这样符合楼主的条件不,可能我没看明白

#16


已经定义了obj这个变量,写掉了var,
就是我想写一个类,继承于Tfilestream类,添加进去一些变量,作为祖类Tfilestream所需的变量,就不用再到处定义变量了,

#17


obj:Tlf;
这样只定义了一个对象的引用而已,对象并没有创建。

#18


我也想创建,但是用obj:=Tlf.create创建会报错啊。

#19


你还没有创建,就使用当然报错了。
正确的写法应该是这样的:

function getsb():integer;
obj:Tlf;
begin
obj := Tlf.Create; //对象使用前必须创建才可以
obj.a:='abc.dat';
obj.fz:=TFileStream.Create(obj.a, fmOpenRead or fmShareExclusive);
...
obj.fz.Free;
obj.free; //用完了就需要释放了。
end;

#20


Tlf 如果没有用到TFileStream的相关内容的话不建议从此继承
你可以从TObject处直接继承就可以了。
如:
Tlf = class(TObject)
end;
上边的代码也可以直接调试通过了。

#21


引用 18 楼 walllacecn 的回复:
我也想创建,但是用obj:=Tlf.create创建会报错啊。

你没有定义新的构造函数

#22


汗啊。。我回了几次了obj := Tlf.Create; //对象使用前必须创建才可以===========这句在编译的时候报错
[Error] funiclass.pas(26): There is no overloaded version of 'Create' that can be called with these arguments

#23


引用 21 楼 lhylhy 的回复:
引用 18 楼 walllacecn 的回复:
我也想创建,但是用obj:=Tlf.create创建会报错啊。

你没有定义新的构造函数

是没有,但是没有构造和析够函数,编译的时候会自动生成这2个。如果调用父类的构造和析够,到处报错。。。所以请高人吧这个结构补充完整啊。

#24


引用 20 楼 smallhand 的回复:
Tlf 如果没有用到TFileStream的相关内容的话不建议从此继承
你可以从TObject处直接继承就可以了。
如:
Tlf = class(TObject)
end;
上边的代码也可以直接调试通过了。

正解啊,但是还要添加修改Tstream类的相关方法,加密和解密,重写这个太难啊,水平不够,从这个继承下来可以避免一些重复的。。

#25


引用 24 楼 walllacecn 的回复:
引用 20 楼 smallhand 的回复:
Tlf 如果没有用到TFileStream的相关内容的话不建议从此继承
你可以从TObject处直接继承就可以了。
如:
Tlf = class(TObject)
end;
上边的代码也可以直接调试通过了。

正解啊,但是还要添加修改Tstream类的相关方法,加密和解密,重写这个太难啊,水平不够,从这个继承下来可以避免一些重复的。。……

果然给我猜对了,你连继承后要用父类的构造函数都不知道,我建议你还是不要另外再写什么加密解密了,先练好基础吧。

#26


引用 25 楼 harryfin 的回复:
引用 24 楼 walllacecn 的回复:

引用 20 楼 smallhand 的回复:
Tlf 如果没有用到TFileStream的相关内容的话不建议从此继承
你可以从TObject处直接继承就可以了。
如:
Tlf = class(TObject)
end;
上边的代码也可以直接调试通过了。

正解啊,但是还要添加修改Tstream类的相关方法,加密和解密,重写这个太……

坦白说我一直觉得你在不懂装懂,不会就别乱发言。还装高深看XX书去。。不过见怪不怪了。你自重。

#27


同意,我不懂装懂,我自重。

#28


是的,继续求从Tfilestream继承的写法。

#1



type
Tlf = class(Tfilestream)
  a:string;
  b:integer;
end;

然后写一个函数
function getsb():integer;
obj:Tlf;
begin
obj := TFileStream.Create(obj.a, fmOpenRead or fmShareExclusive);
obj.a:='abc.dat';
...
obj.Free;
end;

#2


obj := TFileStream.Create(obj.a, fmOpenRead or fmShareExclusive);
这句报错

#3


没看清楚,参数不能用obj.a,因为obj还没创建

你还是先整理清楚自己的思路吧,总体来说对象没创建是不能使用的,我建议你先复习下对象的知识,因为我看你思路比较乱,继承FileStream,又声明个FileStream的属性。

#4


这样试试。
function getsb():integer;
  obj:Tlf;
  a : string;
  begin
     a := 'abc.dat';    
    obj := TFileStream.Create( a, fmOpenRead or fmShareExclusive);
    obj.a:='abc.dat';
    ...
    obj.Free;
  end;

#5


我目的是想吧Tfilestream 所需的参数和获取的值还有Tfilestream封装到一个类里面进行操作

#6


加上 obj:=Tlf.create

#7


不能创建

#8


我觉得是一个派生类里面使用祖类的函数之后在销毁的时候可能越界吧?应当重载祖类的函数在派生类中????求解啊!!!

#9


引用 8 楼 walllacecn 的回复:
我觉得是一个派生类里面使用祖类的函数之后在销毁的时候可能越界吧?应当重载祖类的函数在派生类中????求解啊!!!

你的说法是错的,这是为什么让你去再看看相关知识的原因。

你的错误很简单,都说了你没给obj实例化,你又怎么可以调用obj下面的属性呢?你以为给obj下的属性实例化,就是给obj实例化么?

#10


楼上的你在D7里面运行一下看看是否能调用。。。

#11


引用 10 楼 walllacecn 的回复:
楼上的你在D7里面运行一下看看是否能调用。。。

你的程序是错的当然不能运行啊

#12


你真试了吗?读写都是正常的拜托!

#13


引用 12 楼 walllacecn 的回复:
你真试了吗?读写都是正常的拜托!

那是刚好凑巧碰到能访问进去的情况而已,但是当出现凑巧的时候,就出错了。当你看过Inside VCL这本书之后,你就知道为什么了。

#14


但是当出现凑巧的时候 -> 但是当出现“不”凑巧的时候

#15


定义个变量用来创建这个Tlf 
不知道这样符合楼主的条件不,可能我没看明白

#16


已经定义了obj这个变量,写掉了var,
就是我想写一个类,继承于Tfilestream类,添加进去一些变量,作为祖类Tfilestream所需的变量,就不用再到处定义变量了,

#17


obj:Tlf;
这样只定义了一个对象的引用而已,对象并没有创建。

#18


我也想创建,但是用obj:=Tlf.create创建会报错啊。

#19


你还没有创建,就使用当然报错了。
正确的写法应该是这样的:

function getsb():integer;
obj:Tlf;
begin
obj := Tlf.Create; //对象使用前必须创建才可以
obj.a:='abc.dat';
obj.fz:=TFileStream.Create(obj.a, fmOpenRead or fmShareExclusive);
...
obj.fz.Free;
obj.free; //用完了就需要释放了。
end;

#20


Tlf 如果没有用到TFileStream的相关内容的话不建议从此继承
你可以从TObject处直接继承就可以了。
如:
Tlf = class(TObject)
end;
上边的代码也可以直接调试通过了。

#21


引用 18 楼 walllacecn 的回复:
我也想创建,但是用obj:=Tlf.create创建会报错啊。

你没有定义新的构造函数

#22


汗啊。。我回了几次了obj := Tlf.Create; //对象使用前必须创建才可以===========这句在编译的时候报错
[Error] funiclass.pas(26): There is no overloaded version of 'Create' that can be called with these arguments

#23


引用 21 楼 lhylhy 的回复:
引用 18 楼 walllacecn 的回复:
我也想创建,但是用obj:=Tlf.create创建会报错啊。

你没有定义新的构造函数

是没有,但是没有构造和析够函数,编译的时候会自动生成这2个。如果调用父类的构造和析够,到处报错。。。所以请高人吧这个结构补充完整啊。

#24


引用 20 楼 smallhand 的回复:
Tlf 如果没有用到TFileStream的相关内容的话不建议从此继承
你可以从TObject处直接继承就可以了。
如:
Tlf = class(TObject)
end;
上边的代码也可以直接调试通过了。

正解啊,但是还要添加修改Tstream类的相关方法,加密和解密,重写这个太难啊,水平不够,从这个继承下来可以避免一些重复的。。

#25


引用 24 楼 walllacecn 的回复:
引用 20 楼 smallhand 的回复:
Tlf 如果没有用到TFileStream的相关内容的话不建议从此继承
你可以从TObject处直接继承就可以了。
如:
Tlf = class(TObject)
end;
上边的代码也可以直接调试通过了。

正解啊,但是还要添加修改Tstream类的相关方法,加密和解密,重写这个太难啊,水平不够,从这个继承下来可以避免一些重复的。。……

果然给我猜对了,你连继承后要用父类的构造函数都不知道,我建议你还是不要另外再写什么加密解密了,先练好基础吧。

#26


引用 25 楼 harryfin 的回复:
引用 24 楼 walllacecn 的回复:

引用 20 楼 smallhand 的回复:
Tlf 如果没有用到TFileStream的相关内容的话不建议从此继承
你可以从TObject处直接继承就可以了。
如:
Tlf = class(TObject)
end;
上边的代码也可以直接调试通过了。

正解啊,但是还要添加修改Tstream类的相关方法,加密和解密,重写这个太……

坦白说我一直觉得你在不懂装懂,不会就别乱发言。还装高深看XX书去。。不过见怪不怪了。你自重。

#27


同意,我不懂装懂,我自重。

#28


是的,继续求从Tfilestream继承的写法。