Articulo de referencia

Puntero opaco

En programación informática , un puntero opaco es un caso especial de un tipo de dato opaco , un tipo de dato declarado como un puntero a un registro o estructura de datos de al...

En programación informática , un puntero opaco es un caso especial de un tipo de dato opaco , un tipo de dato declarado como un puntero a un registro o estructura de datos de algún tipo no especificado.

Los punteros opacos están presentes en varios lenguajes de programación , incluidos Ada , C , C++ , D y Modula-2 .

Usar

Si el lenguaje en el que se implementa el puntero es fuertemente tipado , los programas y procedimientos que no tengan información sobre un puntero opaco de tipo T aún pueden declarar variables , matrices y campos de registro de tipo T , asignar valores de ese tipo y compararlos para comprobar si son iguales. Sin embargo, no podrán desreferenciar dicho puntero y solo podrán modificar su contenido llamando a algún procedimiento que contenga la información faltante.

Los punteros opacos son una forma de ocultar los detalles de implementación de una interfaz a los clientes comunes, de modo que la implementación pueda modificarse sin necesidad de recompilar los módulos que la utilizan. Esto también beneficia al programador, ya que se puede crear una interfaz sencilla y la mayoría de los detalles pueden ocultarse en otro archivo. [ 1 ] Esto es importante para proporcionar compatibilidad de código binario a través de diferentes versiones de una biblioteca compartida , por ejemplo.

Esta técnica se describe en Patrones de Diseño como el patrón Puente . A veces se la denomina " clases de manejo ", [ 2 ] el " idioma Pimpl " (por "idioma de puntero a implementación"), [ 3 ] el " idioma de cortafuegos del compilador ", [ 4 ] el " puntero d" o el " Gato de Cheshire ", especialmente entre la comunidad de C++. [ 2 ] Se utiliza ampliamente en las bibliotecas Qt [ 5 ] y KDE [ 6 ] .

Ejemplos

Ada

El paquete Library_Interface esEl tipo Handle es privado limitado ;-- Operaciones...tipo privado Hidden_Implementation ; -- Definido en el cuerpo del paquete tipo Handle es acceso Hidden_Implementation ; fin Library_Interface ;

El tipo Handlees un puntero opaco a la implementación real, que no está definida en la especificación. Cabe destacar que el tipo no solo es privado (para impedir que los clientes accedan a él directamente, sino únicamente a través de las operaciones), sino también limitado (para evitar la copia de la estructura de datos y, por lo tanto, prevenir referencias colgantes).

cuerpo del paquete Library_Interface estype Hidden_Implementation is record ... -- La implementación real puede ser cualquier cosa end record ;-- Definición de las operaciones...fin de la interfaz de la biblioteca ;

Estos tipos a veces se denominan " tipos Taft " –llamados así por Tucker Taft , el principal diseñador de Ada  95– porque se introdujeron en la llamada "Enmienda Taft" a Ada  83. [ 7 ]

do

En Integer.h :

#pragma una veztypedef struct Entero Entero ;/* * El compilador considera que `struct obj` es un tipo incompleto. Los tipos incompletos * pueden usarse en declaraciones. */tamaño_t tamaño_entero ( void );void integerSetValue ( Integer * , int );int integerGetValue ( Entero * );

En Integer.c :

#incluir "Integer.h"typedef struct Integer { int value ; } Integer ;/* * El llamador se encargará de la asignación. * Proporcione únicamente la información requerida */size_t integerSize ( void ) { return sizeof ( Integer ); }void integerSetValue ( Integer * i , int val ) { i -> value = val ; }int integerGetValue ( Integer * i ) { return i -> value ; }

Este ejemplo demuestra una forma de lograr el encapsulamiento de información propio de la programación orientada a objetos utilizando el lenguaje C. Si alguien quisiera modificar la definición de , no sería necesario recompilar ningún otro módulo del programa que utilice el archivo de cabecera, a menos que también se modificara la API . Cabe destacar que podría ser conveniente que las funciones comprobaran que el puntero pasado no es nulo , pero dichas comprobaciones se han omitido anteriormente por brevedad.struct IntegerInteger.hNULL

C++

En MyClass.cppm :

exportar módulo org.example.MyClass ;importar std ;usando std :: unique_ptr ;exportar espacio de nombres org :: ejemplo {clase MyClass { private : struct IntPair ; // No definido aquí unique_ptr <IntPair> ptr ; // Puntero opaco public : MyClass (); // Constructor MyClass ( const MyClass & ); // Constructor de copia MyClass ( MyClass && ); // Constructor de movimiento MyClass & operator = ( const MyClass & ); // Operador de asignación de copia MyClass & operator = ( MyClass && ); // Operador de asignación de movimiento ~ MyClass (); // Destructor// Otras operaciones... };}

En MyClass.cpp :

módulo org.example.MyClass ;espacio de nombres org :: ejemplo {struct MyClass :: IntPair { int a ; int b ; };MyClass :: MyClass () : ptr { std :: make_unique < IntPair > ()} {}MyClass :: MyClass ( const MyClass & other ) : ptr { std :: make_unique < MyClass > ( * other . ptr )} {}MyClass :: MyClass ( MyClass && other ) = default ;MyClass & MyClass :: operator = ( const MyClass & other ) { * ptr = * other . ptr ; return * this ; }MyClass & MyClass :: operador = ( MyClass && ) = predeterminado ;MyClass ::~ MyClass () = default ;}

Véase también

Referencias

  1. Chris McKillop. "Herramientas de programación : punteros opacos" . QNX Software Systems. Archivado del original el 12 de noviembre de 2021. Consultado el 16 de enero de 2019 .
  2. 1 2 Eckel, Bruce (2000). "Capítulo 5: Ocultando la implementación" . Pensando en C++ . Vol. 1: Introducción al C++ estándar (2.ª ed.). Prentice Hall. ISBN    0-13-979809-9.
  3. ^ Batov, Vladimir (25 de enero de 2008). "Haciendo que Pimpl sea fácil" . Diario del Dr. Dobb . Consultado el 7 de mayo de 2008 .
  4. Sutter, Herb (2009) [julio-agosto de 1998]. "The Joy of Pimpls (o, más sobre el modismo del cortafuegos del compilador)" . C++ Report . Vol. 10, n.º 7. Recuperado el 16 de septiembre de 2025 a través de gotw.ca. [enlace al] artículo original sustancialmente como se publicó por primera vez; la versión más reciente se encuentra en el libro Exceptional C++ (2000, Addison-Wesley).  {{cite magazine}}: CS1 mantenimiento: estado de la URL ( enlace )
  5. "d-Pointer" . Wiki de Qt . Consultado el 23 de diciembre de 2016 . 
  6. "Problemas de compatibilidad de políticas/binarios con C++: uso de un d-Pointer" . Wiki de la comunidad de KDE . Consultado el 16 de diciembre de 2025 .
  7. Robert A. Duff (29 de julio de 2002). "Re: ¿Cómo se llama?" . Grupo de noticias : comp.lang.ada . Archivado del original el 29 de julio de 2009 . Recuperado el 11 de octubre de 2007 . 
  • "El modismo de Pimpl" .
  • "Cortafuegos de compilación" .o Sutter, Herb. "Cortafuegos de compilación" .
  • "El modismo rápido de Pimpl" .
Obtenido de " https://en.wikipedia.org/w/index.php?title=Opaque_pointer&oldid=1327917080 "