[英]Dealing with access type in Ada95
我有一個函數的規范,就像一個構造函數。 功能的規格是
function Create_Controller return Type_Controller;
此外,在規范文件中,我有Type_Controller類型,這是一個訪問。 我復制相關的片段:
type Type_Controller_Implementation;
type Type_Controller is access Type_Controller_Implementation;
所以,這就是我的嘗試:
function Create_Controller return Type_Controller
is
My_Controller : aliased Type_Controller_Implementation;
begin
return My_Controller'Access;
end Create_Controller;
我嘗試編譯沒有別名關鍵字的程序,但是,編譯器說:
prefix of "Access" attribute must be aliased
所以,我把別名關鍵字和編譯器現在建議我應該更改規范:
result must be general access type
add "all" to type "Controlador_De_Impresion" defined at controller.ads
問題是我不允許改變規范。 我已經閱讀了Ada Programming Wikibook中關於訪問類型的章節,但我仍然不明白為什么我的代碼不起作用。 我究竟做錯了什么?
Create_Controller函數體的實現是不正確的。 如果它以編碼方式工作,你將返回一個指向該函數體范圍的局部變量的指針...當從函數返回時會立即丟失,留下一個無效的指針。
不,需要分配和返回該類型的實例。 如果沒有需要發生的顯式初始化,您可以簡單地執行:
return new Type_Controller_Implementation;
如果必須進行某些初始化/構造,則:
function Create_Controller return Type_Controller
is
My_Controller : Type_Controller := new Type_Controller_Implementation;
begin
-- Set fields of My_Controller
...
return My_Controller;
end Create_Controller;
當您將訪問類型聲明為access T
,您會說“這是指向T
的指針,它必須指向從池中分配的T
類型的對象”。 (也就是說,分配一個new
關鍵字。)當你聲明的訪問類型, access all T
,你說,它可以指向到一個T
從池中分配的, 或類型的別名的變量T
。
如果類型被聲明為access T
並且您無法更改它,則該類型的所有訪問值都必須指向使用new
分配的內容。 你不能指向一個變量(甚至是一個不在堆棧上的“全局”變量)。
我認為其原因是歷史性的。 Ada的第一個版本(Ada 83)只有“特定於游泳池的類型”。 您根本無法使access
值指向其他變量,而無需欺騙。 這意味着編譯器可以將訪問值作為索引實現到某個存儲塊中,或者作為其他值實現,而不是使它們成為對象的實際地址。 這可以節省空間(訪問值可能小於地址)或允許更靈活地管理池內存。 允許訪問值直接指向對象會帶來一些靈活性。 我認為這就是為什么他們決定保留舊的含義,以實現向后兼容性,並要求使用all
關鍵字來表示新的訪問類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.