2013-06-04 139 views
6

我想修復已使用多年的記錄TMyValue中的設計缺陷,並且我非常想將其修復到記錄本身中 - 以避免更改公共接口 - 而且不需要代碼使用記錄進行更改。保證堆棧記錄的初始化

本質上,缺陷是TMyValue在創建時必須初始化爲零,否則在其上調用Clear方法會導致崩潰。這是因爲它包含一個字段,如果指針非零,則它是指向動態分配內存的指針,Clear將釋放動態內存。

如果TMyValue在堆棧上創建,這是一個問題,因爲堆棧變量在創建時不會自動清零。

我想我可以使用記錄構造函數來清零記錄,但記錄構造函數不能無參數。推測這意味着當在堆棧上創建記錄時,不能強制自動執行記錄構造函數。

我懷疑我的問題的答案是「它不能做」。請證明我錯了!

回答

7

在您的記錄中添加一個虛擬字符串成員。 由於字符串是託管類型,因此當記錄進入作用域時,它將被初始化爲空字符串。

因此,在調用Clear方法時,首先測試虛擬字符串是否爲空。 將字符串設置爲適合使用邏輯的值以將記錄標記爲已初始化。

+0

不錯。我總是喜歡讓編譯器讓你的生活更輕鬆。 –

+1

@MarjanVenema,知道一些技巧總是很好。但是,能夠在記錄上聲明初始化/完成例程應該在很久以前就已經實施了。參見['QC21729記錄操作符重載:請執行「Initialize」和「Finalize」操作符](http://qc.embarcadero.com/wc/qcmain.aspx?d=21729)。我想補充說的是,所有內部程序也應該能夠用於類操作符的記錄。我的意思是複製,高,低,長度,SetLength等 –

+0

哦,是啊!投票,我輸入... –