請問constructor Create(); 中的代碼執行失敗,我應怎樣 FREE 了這個Clas |
尚未結案
|
Dot.com
一般會員 發表:19 回覆:18 積分:7 註冊:2003-07-03 發送簡訊給我 |
請問我繼承了一個類:
TMyClass = Class(TObject)
public
constructor Create(FileName:string);
end; implementation constructor TMyClass.Create(FileName: string);
begin
inherited Create;
if FileExists(FileName) then
try
DoSth; //如果這果失敗,我應怎樣處理呢?
except
//這果應該怎樣寫才不創建這個CLASS呢? freeAndNil(Self); 行嗎?
end
else begin
//這果又應該怎樣寫才不創建這個CLASS呢?
end;
end;
另外:
procedure TForm1.Button1Click(Sender: TObject);
var
MyClass:TMyClass;
begin
try
MyClass := MyClass.Create('abc.txt');
//這裏編譯時爲什麽會有:Variable 'MyClass' might not have been
//initialized 的警告?
except
MyClass.Free;
end;
end; 發表人 - Dot.com 於 2003/12/16 23:30:46
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
小弟淺見:
物件應該沒有還到錯誤自己釋放自己的,通常都是建立物件的程式要負責在適當時機(例如 raise exception)把物件free掉.
這裡建議你應該是以下這樣的做法:
constructor TMyClass.Create(FileName: string); begin inherited Create; try doSomething except raise Exception.Create('do something error/create error....'); end; end;然後建立物件的程式碼這樣做: var obj:TMyClass; begin try obj:=TMyClass.Create(FileName); except ShowMessage('要告訴使用者的錯誤訊息..'); end; end; |
Dot.com
一般會員 發表:19 回覆:18 積分:7 註冊:2003-07-03 發送簡訊給我 |
To change.jian 大俠:
如果沒發生到 錯誤 ,如下不滿足到某些條件,我就不創建這個 CLASS ,我又應該怎樣做呢?謝謝!
Constructor TMyClass.Create(FileName: string);
begin
inherited Create;
if FileExists(FileName) then
try
DoSth; //如果這果失敗,我應怎樣處理呢?
except
//這果應該怎樣寫才不創建這個CLASS呢? freeAndNil(Self); 行嗎?
end
else begin
//如果找不到 FileName 這個文件(並沒有發生except),則不創建這個 CLASS 的實體,
//這果又應該怎樣寫才不創建這個CLASS呢?
end;
end;
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
引言: To change.jian 大俠: 如果沒發生到 錯誤 ,如下不滿足到某些條件,我就不創建這個 CLASS ,我又應該怎樣做呢?謝謝! Constructor TMyClass.Create(FileName: string); begin inherited Create; if FileExists(FileName) then try DoSth; //如果這果失敗,我應怎樣處理呢? except //這果應該怎樣寫才不創建這個CLASS呢? freeAndNil(Self); 行嗎? end else begin //如果找不到 FileName 這個文件(並沒有發生except),則不創建這個 CLASS 的實體, //這果又應該怎樣寫才不創建這個CLASS呢? end; end;為你所設計的物件加上個function或property,用以檢查是否滿足某些條件,然後建立這個物件的程式,再依據這個屬性值來決定是否free.如下: TMyClass=Class(TObject) public constructor create(FileName:String); function IsReadyForUse:Boolean; end;呼叫的程式 var Obj:TMyClass; begin Obj:=TMyClass.Create(MyFile); try if not Obj.IsReadyForUse then Obj.Free; finally if Assigned(Obj) then Obj.Free; end; end; |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
引言: 另外:關於編譯警告的部份, 將 MyClass := TMyClass.Create('abc.txt'); 這行 移到 try .. except 的區塊外, 就不會出現這個 warning 訊息了, 即:procedure TForm1.Button1Click(Sender: TObject); var MyClass:TMyClass; begin try MyClass := MyClass.Create('abc.txt'); //這裏編譯時爲什麽會有:Variable 'MyClass' might not have been //initialized 的警告? except MyClass.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); var MyClass: TMyClass; begin MyClass := TMyClass.Create('abc.txt'); try // ... except MyClass.Free; end; end;--- Everything I say is a lie. 發表人 - hagar 於 2003/12/17 17:34:35 |
Dot.com
一般會員 發表:19 回覆:18 積分:7 註冊:2003-07-03 發送簡訊給我 |
我個人認爲:
raise Exception.Create('do something error/create error....');
或 Abort; 挺好的
procedure TForm1.Button1Click(Sender: TObject); var MyClass: TMyClass; begin try MyClass := TMyClass.Create('abc.txt'); except if assigned(MyClass) then //這裏 MyClassc 已經是 Destroy 掉,只是 MyClass 指標 //非空而矣。所以下一句出現記憶體 read 出錯。MD ,就這 //裏讓我鑽了兩個晚上的死胡同,現在才想明白。 MyClass.Free; end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |