带参数类的实现 (100分)

  • 主题发起人 主题发起人 bluerain
  • 开始时间 开始时间
B

bluerain

Unregistered / Unconfirmed
GUEST, unregistred user!
在C++中可以十分方便的实现一个带自定义参数的类,这在很多时候是方便的.
但是如何在Delphi中实现呢?
看了一下http://www.delphibbs.com/delphibbs/dispq.asp?lid=683794,还是
不清楚.

我看了一下TStream(从TObject继承)和TFileStream(从TStream继承),自己写了一个,
但是每次在Create(str : string)中赋值时总是出现问题(应该是没有分配内存吧).
代码部分很简单:

type
TLayout = class(TObject)
end;

TChLayout = Class(TLayout)
Private
FStr : string;
public
constructor Create(str : string);
function Validate : boolean;
end;

implement

constructor TChLayout.Create(str : string);
begin
FStr := str
// 出错
end;

function TChLayout.Validate : boolean;
begin
if Length(FStr) <> 8 then
result := False
else
result := True;
end;

 
unit Unit2;

interface

type
TLayout = class(TObject)
end;

TChLayout = Class(TLayout)
Private
FStr : string;
public
constructor Create(str : string);overload;
end;

implementation

constructor TChLayout.Create(str : string);
begin
inherited Create;
FStr := str

end;

end.
 
constructor TChLayout.Create(str: string);
begin
FStr := str;
end;
 
Type
TLayout = class(TObject)
end;

TChLayout = Class(TLayout)
Private
FStr : string;
public
constructor Create(str : string);
end;
implementation

constructor [red]TChLayout.[/red]Create(str : string);
begin
FStr := str

end;
 
sorry,我的贴出来的部分代码是凭印象的,所以有一些问题。不过在Delphi中是没有问题
的。也就是上面几位仁兄的代码。我现在改了一下。
我的意思是从语法上代码是没有问题的,但是运行时还是不对。是不是这种类的定义需要
有一些注意的地方。(具体代码我今天晚上会重新再贴一边,我现在手边没有Delphi,
对不起各位)

 
总算回到家了.再次把代码贴一遍.也再次对上面几位DFW道歉.耽误各位时间了.
麻烦再指点一二.不胜感激.

类定义部分:

代码:
unit myclass;

interface

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

type
  TLayout = Class(TObject)
  end;

  TChLayout = Class(TLayout)
  private
    FStr : string;
  public
    constructor Create(str : string);overload;
    function Validate : boolean;
  end;

implementation

Constructor TChLayout.Create(str : string);
begin
  inherited Create;
  FStr := str;
end;

function TChLayout.Validate : boolean;
begin
  if Length(Fstr) <> 8 then
    result := False
  else
    result := True;
end;

end.
试验调用部分:
代码:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  ch : TChLayout;
begin
  ch.Create(edit1.text);
  if ch.Validate then
    edit2.text := 'true'
  else
    edit2.Text := 'false';
end;

end.
 
忘了写一些错误信息了.
编译的时候有warning:Variable 'ch' might not have been initialized.
运行时错误为:
Access violation at address 00402F7E in module 'Project1.exe'.
Read of address 0000BD0D.

 
ch.Create(edit1.text);
改为 ch:=TChLayout.Create(edit1.text);
 
thx. 胡涂了,犯这种错误,呵呵.
 
后退
顶部