¿Qué es un identificador en C ++?


97

Me han dicho que un identificador es una especie de puntero, pero no, y que te permite mantener una referencia a un objeto, en lugar del objeto en sí. ¿Qué es una explicación más elaborada?



2
Mire en el patrón de Cadena de responsabilidad, aprenderá que un "Identificador" es básicamente un nodo, y que un "Manejador" es un pequeño conjunto de ellos. La "magia" proviene de la recursividad

Respuestas:


100

Un identificador puede ser cualquier cosa, desde un índice entero hasta un puntero a un recurso en el espacio del kernel. La idea es que brinden una abstracción de un recurso, por lo que no necesita saber mucho sobre el recurso en sí para usarlo.

Por ejemplo, el HWND en la API de Win32 es un identificador para una ventana. Por sí solo es inútil: no se puede obtener ninguna información de él. Pero páselo a las funciones adecuadas de la API y podrá realizar una gran cantidad de trucos diferentes con él. Internamente, puede pensar en el HWND como solo un índice en la tabla de ventanas de la GUI (que puede no ser necesariamente la forma en que se implementa, pero hace que la magia tenga sentido).

EDITAR: No estoy 100% seguro de lo que estaba preguntando específicamente en su pregunta. Se trata principalmente de C / C ++ puro.


13
Un identificador puede ser útil para guardar estados (entre otros). Si tienes datos en una estructura como std :: vector. Su objeto puede estar en diferentes ubicaciones de memoria en diferentes momentos durante la ejecución de un programa, lo que significa que su puntero a esa memoria cambiará los valores. Con un identificador que nunca cambia, siempre hace referencia a su objeto. Imagine guardar un estado de un programa (como en un juego): no guardaría la ubicación de un puntero en los datos y luego importaría los datos nuevamente e intentaría obtener esa dirección en la memoria. Sin embargo, puede guardar un identificador con sus datos e importar los datos y el identificador.
SinisterRainbow

¿Es posible convertir un HANDLE en un equivalente en Linux? Tengo que migrar un programa que usa HANDLE de Windows a Linux.
Cornel Verster

1
Esa es la respuesta correcta, que pueden ser cualquier cosa y que el código que los usa define el tipo de identificador. Traté de hacer una versión más concisa de mi propia respuesta similar, no pude evitarlo, para la posteridad. @CornelVerster: son iguales en linux. Quiero decir, no los identificadores del sistema operativo, sino el concepto. Por lo tanto, depende del identificador en cuanto a su migración, o incluso necesita migrar.
dyasta

@Matthew Iselin: en cualquier documentación de API, ¿definen que esa cosa es un controlador, entonces deberíamos saber pasarlos a funciones? De lo contrario, ¿cómo podemos saber qué es un controlador en la documentación de API?
Amin Khormaei

51

Un identificador es un puntero o índice sin un tipo visible adjunto. Normalmente ves algo como:

 typedef void* HANDLE;
 HANDLE myHandleToSomething = CreateSomething();

Entonces, en su código, simplemente pasa HANDLE como un valor opaco.

En el código que usa el objeto, lanza el puntero a un tipo de estructura real y lo usa:

 int doSomething(HANDLE s, int a, int b) {
     Something* something = reinterpret_cast<Something*>(s);
     return something->doit(a, b);
 }

O lo usa como índice para una matriz / vector:

 int doSomething(HANDLE s, int a, int b) {
     int index = (int)s;
     try {
         Something& something = vecSomething[index];
         return something.doit(a, b);
     } catch (boundscheck& e) {
         throw SomethingException(INVALID_HANDLE);
     }
 }

29

Un identificador es una especie de puntero en el sentido de que normalmente es una forma de hacer referencia a alguna entidad.

Sería más exacto decir que un puntero es un tipo de identificador, pero no todos los identificadores son punteros.

Por ejemplo, un identificador también puede ser un índice en una tabla en memoria, que corresponde a una entrada que en sí misma contiene un puntero a algún objeto.

La clave es que cuando tienes un "identificador", no sabes ni te importa cómo ese identificador termina identificando lo que identifica, todo lo que necesitas saber es que lo hace.

También debería ser obvio que no hay una respuesta única a "qué es exactamente un identificador", porque los identificadores para diferentes cosas, incluso en el mismo sistema, pueden implementarse de diferentes maneras "bajo el capó". Pero no debería tener que preocuparse por esas diferencias.


6

En C ++ / CLI, un identificador es un puntero a un objeto ubicado en el montón de GC. La creación de un objeto en el montón de C ++ (no administrado) se logra usando newy el resultado de una newexpresión es un puntero "normal". Un objeto gestionado se asigna en el montón GC (gestionado) con una gcnewexpresión. El resultado será una manija. No puede hacer aritmética de punteros en los controladores. No liberas asas. El GC se hará cargo de ellos. Además, el GC es libre de reubicar objetos en el montón administrado y actualizar los identificadores para señalar las nuevas ubicaciones mientras se ejecuta el programa.


5

Esto aparece en el contexto de Handle-Body-Idiom , también llamado idioma Pimpl. Le permite a uno mantener la ABI (interfaz binaria) de una biblioteca igual, manteniendo los datos reales en otro objeto de clase, al que simplemente se hace referencia mediante un puntero contenido en un objeto "identificador", que consta de funciones que delegan a esa clase " Cuerpo".

También es útil para permitir un tiempo constante y un intercambio seguro de excepciones de dos objetos. Para ello, solo se debe cambiar el puntero que apunta al objeto del cuerpo.


2

Un mango es lo que quieras que sea.

Un identificador puede ser un entero sin signo utilizado en alguna tabla de búsqueda.

Un identificador puede ser un puntero hacia, o hacia, un conjunto de datos más grande.

Depende de cómo se comporte el código que usa el identificador. Eso determina el tipo de mango.

La razón por la que se utiliza el término " manejar " es lo importante. Eso los indica como un tipo de objeto de identificación o acceso. Es decir, para el programador, representan una "clave" o acceso a algo.


2

HANDLE hnd; es lo mismo que void * ptr;

HANDLE es un typedef definido en el archivo winnt.h en Visual Studio (Windows):

typedef void *HANDLE;

Leer más sobre HANDLE


1
Eso solo se aplica a Windows, y solo a uno de los muchos tipos de identificadores que se utilizan en la arquitectura de Windows. Sin embargo, eso es lo que se conocería como un "identificador de nivel de aplicación de Windows normal".
dyasta
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.