簡體   English   中英

處理Ada95中的訪問類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM