2013-03-16 66 views
1

我是Free Pascal和Lazarus的新手。我正在測試新的「高級記錄」功能,並獲得看起來不必要的編譯器警告。拉撒路(Free Pascal)。看似不必要的編譯器警告

該代碼非常簡單,只是一個記錄用一個方法來初始化數據字段。喜歡的東西:

{$mode delphi} 

type TTest = 
    record 
    a,b: double; 
    procedure Init(x,y: double); 
    end 

procedure TTest.Init(x,y: double); 
begin 
    test.a := x; 
    test.b := y; 
end; 


var t: TTest; 
begin 
    t.Init(0.1,0.2); 

所示最後一行,「t.Init()」,總是生成編譯器警告「變量‘t’似乎並沒有被初始化」。

好吧,這只是警告,顯然我可以忍受它,但我只是想確保它不是由於我的一些根本的誤解。


編輯添加新信息。

重新方法verus構造函數點。 深入探討這一點,我很高興FPC不允許構造函數進行記錄。 Delphi具有構造函數,但沒有析構函數,就我可以告訴構造函數(用於記錄)而言,絕對沒有方法無法完成的工作。我是一個極簡主義者,所以對我來說,沒有任何意義可以使用額外的語法,它只不過是一些現有的語法。

特別是對於這樣一個簡單的記錄,聲明它的行爲(var t:TTest)完成了構建該記錄所需的所有工作。其他任何東西(比如我的Init)只是設置值,它不會構造任何東西。所以就我所見,構造函數不是答案,編譯器只需要放下警告。

研究問題我遇到了另一種經常使用的技術,即所謂的「工廠功能」。也就是說,一個函數外記錄的如:

function InitTTest(x,y: double): TTest; 
begin 
    Result.a := x; 
    Result.b := y; 
end; 

這種技術確實工作,並擺脫了警告消息。我不喜歡這種方法,但我不會使用它。高級記錄沒有繼承和類的其他功能,封裝是他們爲他們所做的一切。所以我真的不喜歡在這樣的記錄之外建立一個「工廠職能」。

請記住,以上只是一個「noob」的意見,經過一些小小的研究後回答我自己的問題。所以如果我對上述任何事情都有錯,我很樂意予以糾正。 :)

+3

那麼在技術上,警告* *是正確的 - 你*的*使用' t'沒有被初始化。編譯器不知道你將要使用'Init'方法來設置記錄(我想它可以算出來,但對於更復雜的記錄看起來像很多工作)。我想這是構造函數的用途,但我在FreePascal上有點生疏,所以我不確定記錄是否可以具有構造函數(從技術角度而言)。 – Thomas 2013-03-16 07:45:32

+0

謝謝托馬斯。是的,我總是在使用類時使用構造函數,但不使用記錄,因爲它們不像類那樣動態「實例化」。但是你是對的,這些新記錄可以有構造函數,所以我會嘗試並報告回來。 – Stuart 2013-03-16 08:01:22

+0

只需更新我的發現使用構造函數。顯然Delphi允許記錄具有構造函數,但不包含FPC。我只是測試了將Init()從一個過程改變爲一個構造函數,並且它給出了消息「**錯誤:構造函數在記錄或記錄助手中不允許。**」。所以我想這不是答案。 – Stuart 2013-03-16 08:09:01

回答

3

是的,那是什麼構造是,與FPC 主幹以下編譯並不會產生警告:

{$mode delphi} 

type TTest = 
    record 
    a,b: double; 
    constructor Init(x,y: double); 
    end; 

constructor TTest.Init(x,y: double); 
begin 
    a := x; 
    b := y; 
end; 


var t: TTest; 
begin 
    t.Init(0.1,0.2); 
end. 
+0

嗨馬可。我正在使用FPC 2.06(下載的fpc-2.6.2.i386-win32.exe),這絕對不適合我。就像我以前說過的,我得到錯誤:「**錯誤:構造函數不允許在記錄或記錄助手**中」,所以它甚至不會編譯。什麼是「FPC主幹」,就像最新的「一夜之間」建造什麼的。如果是這樣,那麼這個功能將會在下一個穩定的版本中發佈,對嗎? – Stuart 2013-03-16 18:36:31

+0

還有一個其他問題。如果這將成爲下一個穩定版本的一部分,那麼在這裏使用關鍵字「構造函數」而不是「過程」是否真的不會改變它以任何方式運行的方式?那就是所謂的「語法糖」。這似乎是一個故事,當我查看構造函數和常規方法記錄之間的差異時,我得到了很多。 – Stuart 2013-03-16 18:44:03

+0

如果有人運行「主幹」構建可以回答最後一件事。所以現在允許「構造函數」並且抑制警告消息。但是,只是想知道,即使您仍然使用過程而不是構造函數,警告消息也會被抑制嗎?只是想知道,因爲德爾福(D2009)似乎不在乎任何方式。 – Stuart 2013-03-16 19:19:32