Diferencia entre revisiones de «Programación en Ada/Tipos/Punteros a objetos»

Contenido eliminado Contenido añadido
Plantillas
Línea 10:
objetos, que se pueden crear y destruir dinámicamente.
 
El nombre de ''access'' en vez del habitual ''pointer'' se debe a que al diseñar Ada se quería huir de la mala fama que los punteros habían creado gracias a lenguajes como C, en los que se puede usar los punteros de manera muy insegura. Los tipos acceso de Ada son más seguros entre otras cosas porque no existe la aritmética de punteros, especialmente peligrosa. Además el uso de punteros en Ada es prescindible en muchas más situaciones que en C.
 
Las variables de tipo puntero en Ada se inicializan implicitamente a null.
Línea 17:
Por ejemplo, se puede definir un puntero a un tipo entero de esta manera:
 
{{Ada/Reservada|type}} PEntero {{Ada/Reservada|is}} {{Ada/Reservada|access}} Integer;
 
En un ejemplo con registros:
 
{{Ada/Reservada|declare}}
{{Ada/Reservada|type}} TBúfer {{Ada/Reservada|is}}
{{Ada/Reservada|record}}
Mensaje: String(1..4);
Prioridad: Integer;
{{Ada/Reservada|end}} {{Ada/Reservada|record}};
{{Ada/Reservada|type}} PTBúfer {{Ada/Reservada|is}} {{Ada/Reservada|access}} TBúfer;
Mensaje1, Mensaje2: PTBúfer;
{{Ada/Reservada|begin}}
Mensaje1 := {{Ada/Reservada|new}} TBúfer; {{Ada/-- |Se crea un objeto de tipo TBúfer.}}
Mensaje2 := {{Ada/Reservada|new}} TBúfer'(Prioridad => 2, Mensaje => {{Ada/"|Hola"}});
{{Ada/-- |Con all se puede desreferenciar el puntero.}}
{{Ada/-- |Mensaje1 es un puntero y Mensaje1.all es el registro.}}
Mensaje1.{{Ada/Reservada|all}}.Prioridad := 3;
{{Ada/-- |Sin embargo, al acceder a campos del registro la desreferenciación}}
{{Ada/-- |puede hacerse implícita y .all es opcional en esos casos:}}
Mensaje1.Prioridad := 3;
{{Ada/Reservada|end}};
 
Es útil para implementar listas, colas, árboles y grafos. Por ejemplo:
 
{{Ada/Reservada|declare}}
{{Ada/-- |TNodoÁrbolBinario se necesita para definir el puntero.}}
{{Ada/Reservada|type}} TNodoÁrbolBinario; {{Ada/-- |Se declara después.}}
{{Ada/Reservada|type}} PTNodoÁrbolBinario {{Ada/Reservada|is}} {{Ada/Reservada|access}} TNodoÁrbolBinario;
{{Ada/Reservada|type}} TNodoÁrbolBinario {{Ada/Reservada|is}}
{{Ada/Reservada|record}}
RamaIzda: PTNodoÁrbolBinario;
Dato: Float;
RamaDcha: PTNodoÁrbolBinario;
{{Ada/Reservada|end}} {{Ada/Reservada|record}};
ÁrbolBinario: PTNodoÁrbolBinario;
{{Ada/Reservada|begin}}
{{Ada/-- |Se crea la raíz del árbol binario.}}
ÁrbolBinario := {{Ada/Reservada|new}} TNodoÁrbolBinario'({{Ada/Reservada|null}}, 1.0, {{Ada/Reservada|null}});
{{Ada/Reservada|end}};
 
==Liberación de memoria==
Línea 64:
procedimiento genérico [[Programación en Ada / Unidades predefinidas / Ada.Unchecked_Deallocation|Ada.Unchecked_Deallocation]] [http://www.adaic.org/standards/95lrm/html/RM-13-11-2.html#I4441], por ejemplo:
 
{{Ada/Reservada|with}} Ada.Unchecked_Deallocation;
{{Ada/Reservada|procedure}} Ejemplo_Liberar_Memoria {{Ada/Reservada|is}}
{{Ada/Reservada|type}} TVector {{Ada/Reservada|is}} {{Ada/Reservada|array}} (Integer {{Ada/Reservada|range}} <>) {{Ada/Reservada|of}} Float;
{{Ada/Reservada|type}} PVector {{Ada/Reservada|is}} {{Ada/Reservada|access}} TVector;
PV: PVector;
{{Ada/Reservada|procedure}} Liberar_Vector {{Ada/Reservada|is}} {{Ada/Reservada|new}} Ada.Unchecked_Deallocation
(TVector, PVector);
{{Ada/Reservada|begin}}
PV := {{Ada/Reservada|new}} TVector(1..10);
PV.{{Ada/Reservada|all}} := (others => 0.0);
{{Ada/-- |...}}
Liberar_Vector (PV); {{Ada/-- |La memoria es liberada y PV es ahora null}}
{{Ada/Reservada|end}} Ejemplo_Liberar_Memoria;
 
El nombre de Unchecked_Deallocation viene del hecho de que no hay comprobación de que no queden punteros colgantes (''dangling pointers''), es decir que si se ha copiado el puntero en otra variable, después de llamar a Liberar_Vector el puntero copia está apuntando a una dirección de memoria no reservada y los efectos son imprevisibles, puesto que se puede haber reservado y se pude escribir o leer memoria que ya no pertenece a ese objeto.
Línea 86:
 
== Manual de referencia de Ada ==
*[http:{{Ada//www.adaic.com/standards/95lrm/html/RM-RM2|3-|10.html 3.10 |Access Types]}}
[[en:Programming:Ada:Types:access]]