大致代碼如下:
type
TTestClass = class(TObject)
private
fclass:TClass;
public
item:TObject;
constructor create(aclass:TClass);
implementation
constructor TTestClass.Create(aclass:TClass);
begin
fclass:=aclass;
item:=fclass.Create;
end;
本意是想在使用這個類時,傳入不同的型別,比如tstringbuilder等,自動生成物件,但是運行結果item都是空的,跟蹤fclass.Create;發現呼叫的是tobject.create,而不是tstringbuilder的create方法,所以沒有實作。請問這個功能如何實作
uj5u.com熱心網友回復:
item:=fclass.Create;這樣當然不行,要:item:=aclass.Create;
uj5u.com熱心網友回復:
好像這樣也不行
uj5u.com熱心網友回復:
(fClass.NewInstance).Create()uj5u.com熱心網友回復:
這樣好像也不行,在create之前,item是nil,create之后,item雖然不是nil了,但是滑鼠移動上去看,是(),似乎也沒有成功。
uj5u.com熱心網友回復:
可以的。
var
a: TTestClass;
begin
a := TTestClass.Create(TStringList);
writeln(a.Item.ClassName);
end;
uj5u.com熱心網友回復:
item:=fclass.Create;這樣當然不行,要:
item:=aclass.Create;
好像這樣也不行
可以的。
var
a: TTestClass;
begin
a := TTestClass.Create(TStringList);
writeln(a.Item.ClassName);
end;
我用tstringbuilder試了一下,雖然classname可以顯示出“tstringbuilder”,但是一旦append,就會報錯list capacity out of bounds的錯誤, 就像沒有創建成功一樣
uj5u.com熱心網友回復:
item:=fclass.Create;這樣當然不行,要:
item:=aclass.Create;
好像這樣也不行
可以的。
var
a: TTestClass;
begin
a := TTestClass.Create(TStringList);
writeln(a.Item.ClassName);
end;
我用tstringbuilder試了一下,雖然classname可以顯示出“tstringbuilder”,但是一旦append,就會報錯list capacity out of bounds的錯誤, 就像沒有創建成功一樣
使用的代碼是TStringbuilder(a.item).Append('122');
uj5u.com熱心網友回復:
我試了一下,確實有你說的問題,除錯發現是TStringBuilder.Create;沒有執行(雖然實體確實建立了),FMaxCapacity沒有被初始化,還是0,一Append就超出限制了。所以看來用 item:=fclass.Create;直接創建實體是有問題的(對于有初始化類成員的類)。uj5u.com熱心網友回復:
我試了一下,確實有你說的問題,除錯發現是TStringBuilder.Create;沒有執行(雖然實體確實建立了),FMaxCapacity沒有被初始化,還是0,一Append就超出限制了。所以看來用 item:=fclass.Create;直接創建實體是有問題的(對于有初始化類成員的類)。
那這個功能該如何實作,求教,由于我的類是直接繼承的tobject,可能不能使用getclass和findclass
uj5u.com熱心網友回復:

我試了一下,確實有你說的問題,除錯發現是TStringBuilder.Create;沒有執行(雖然實體確實建立了),FMaxCapacity沒有被初始化,還是0,一Append就超出限制了。所以看來用 item:=fclass.Create;直接創建實體是有問題的(對于有初始化類成員的類)。
那這個功能該如何實作,求教,由于我的類是直接繼承的tobject,可能不能使用getclass和findclass
突然想起來,我測驗過,如果傳入tstringbuilder,那么fclass和tstringbuilder的指標地址是一樣的,也就說其實fclass已經指向了tstringbuilder的vmt,按道理說應該可以實作的。只不過直接fclass.create,是不是編譯器不能分辨到底我是想生成tobject的實體還是tstringbuilder的實體,所以沒成功。
uj5u.com熱心網友回復:
即便你用item:=fclass.Create; 使用item的時候還是要判斷一下是什么類實體,然后再cast或者用as操作,所以創建實體的時候判斷一下也不是什么大問題,比如:constructor TTestClass.Create(aclass:TClass);
begin
inherited Create;
fclass:=aclass;
if aclass = TStringBuilder then
Item := TStringBuilder.Create
else // 其他型別逐一判斷
Item := aclass.Create;
end;
uj5u.com熱心網友回復:
稍微研究一下,Item := aclass.Create;這實際上是呼叫了TStringBuilder.NewInstance;來創建實體(如果傳入的是TStringBuilder的話),并沒有呼叫TStringBuilder.Create;uj5u.com熱心網友回復:
如果可以從傳入的aclass獲得實際類的建構式地址,比如TStringBuilder.Create; 那還是有希望通過傳入的類參考創建正確的實體,關鍵是通過RTTI能否得到某個類的建構式(也是方法)的地址?需要研究一下(我看到以前borland newsgroup的帖子說不可以)。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/76050.html
標籤:語言基礎/算法/系統設計
上一篇:delphi7檔案保存錯誤
