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?
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?
Respuestas:
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.
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);
}
}
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.
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 new
y el resultado de una new
expresión es un puntero "normal". Un objeto gestionado se asigna en el montón GC (gestionado) con una gcnew
expresió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.
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.
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.
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