2009-08-19 35 views
76

Me han dicho que un identificador es una especie de puntero, pero no lo es, y que le permite mantener una referencia a un objeto, en lugar de al objeto mismo. ¿Cuál es una explicación más elaborada?¿Qué es un identificador en C++?

+6

http://en.wikipedia.org/wiki/Handle_%28computing%29 – Jherico

+0

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

Respuesta

79

Un identificador puede ser cualquier cosa, desde un índice entero a un puntero a un recurso en el espacio del kernel. La idea es que proporcionen 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 Win32 es un controlador para una ventana. Por sí solo es inútil: no puedes obtener ninguna información de él. Pero pásalo a las funciones API correctas, y puedes realizar una gran cantidad de trucos diferentes con él. Internamente, puede pensar que HWND es 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 está 100% seguro de lo que específicamente hace en su pregunta. Esto se trata principalmente de puro C/C++.

+10

Una manija puede ser útil para guardar estados (entre otros). Si tiene datos en una estructura como un 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 mango nunca cambia, siempre hace referencia a su objeto. Imagine guardar un estado de un programa (como en un juego): no guardará una ubicación de puntero a datos y luego importará los datos nuevamente e intentará obtener esa dirección en la memoria. Sin embargo, puede guardar un identificador con sus datos e importar los datos y manejarlos. – SinisterRainbow

+0

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

+1

Esa es la respuesta correcta, que pueden ser cualquier cosa, y que el código que los usa define el tipo de manejador. Traté de hacer una versión más concisa de mi propia respuesta similar, no pude evitarlo, para la posteridad. @CornelVerster - Son lo mismo en Linux. Quiero decir, no maneja el SO, sino el concepto. Entonces, depende del manejo en cuanto a su migración, o incluso necesita migrar. –

4

En C++/CLI, un identificador es un puntero a un objeto ubicado en el montón del GC. La creación de un objeto en el montón C++ (no administrado) se logra usando new y el resultado de una expresión new es un puntero "normal". Un objeto gestionado se asigna en el montón GC (gestionado) con una expresión gcnew. El resultado será un mango. No se puede hacer aritmética de punteros en los controladores. Usted no libera identificadores. El GC se encargará de ellos. Además, el GC puede reubicar objetos en el montón administrado y actualizar los identificadores para que apunten a las nuevas ubicaciones mientras el programa se está ejecutando.

4

Esto aparece en el contexto de Handle-Body-Idiom, también llamado modismo Pimpl. Permite mantener la ABI (interfaz binaria) de una biblioteca, manteniendo los datos reales en otro objeto de clase, al que hace referencia simplemente un puntero en un objeto "handle", que consiste en funciones que delegan en esa clase " Cuerpo".

También es útil para habilitar el intercambio seguro de tiempo y seguridad de dos objetos. Para esto, simplemente debe intercambiarse el puntero que apunta al objeto del cuerpo.

25

Un identificador es un tipo 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 asa, pero no todos los punteros son punteros.

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

La clave es que cuando tienes un "identificador", ni sabes ni te importa cómo ese identificador realmente 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 para "qué es exactamente un identificador", porque se maneja a diferentes cosas, incluso en el mismo sistema, se puede implementar de diferentes maneras "bajo el capó". Pero no debería preocuparse por esas diferencias.

+1

Su respuesta complementa esta https://stackoverflow.com/a/1923646/2188550 – Ivanzinho

41

Un identificador es un puntero o índice sin ningún tipo visible adjunto. Por lo general, ve algo como:

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

Por lo tanto, en su código, simplemente pase HANDLE alrededor como un valor opaco.

En el código que utiliza el objeto, se proyecta el puntero a un tipo de estructura real y lo utiliza:

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

O se utiliza como un índice en 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); 
    } 
} 
0
HANDLE hnd; is same as void * ptr; 

HANDLE es un tipo de letra definido en el archivo winnt.h en visual studio (windows).

I.C: typedef void *HANDLE;

Leer más sobre HANDLE

+1

Eso solo se aplica a Windows, y solo uno de los muchos tipos de identificadores utilizados a través de la arquitectura de Windows. Sin embargo, ese ** es ** lo que se conocería como un 'identificador de nivel de aplicación de Windows normal'. –

0

Un mango es lo que quiere 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 utiliza el identificador. Eso determina el tipo de mango.

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