Question

On m'a dit qu'une poignée est en quelque sorte un pointeur, mais pas, et qu'il vous permet de garder une référence à un objet, plutôt que l'objet lui-même. Qu'est-ce qu'une explication plus élaborée?

Était-ce utile?

La solution

Une poignée peut être quelque chose d'un indice entier à un pointeur vers une ressource dans l'espace du noyau. L'idée est qu'ils fournissent une abstraction d'une ressource, de sorte que vous n'avez pas besoin de savoir beaucoup sur la ressource elle-même à l'utiliser.

Par exemple, le HWND dans l'API Win32 est une poignée pour une fenêtre. Par lui-même, il est inutile: vous ne pouvez pas glaner des informations de celui-ci. Mais passer aux bonnes fonctions de l'API, et vous pouvez effectuer une multitude de trucs différents avec elle. En interne, vous pouvez penser à l'HWND comme juste un index dans la table des fenêtres de l'interface graphique (qui peut ne pas être nécessairement la façon dont il est mis en œuvre, mais il fait le sens magique de faire).

EDIT: Pas certain à 100% que vous demandez spécifiquement dans votre question. Cela parle principalement de pur C / C ++.

Autres conseils

Une poignée est un pointeur ou un index avec aucun type visible attaché à elle. En général, vous voyez quelque chose comme:

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

Dans votre code, vous venez de passer MANCHE autour comme une valeur opaque.

Dans le code qui utilise l'objet, il jette le pointeur sur un type réel de la structure et l'utilise:

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

Ou il l'utilise comme un indice à un tableau / vecteur:

 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);
     }
 }

Une poignée est une sorte de pointeur en ce qu'il est généralement une façon de référencer une entité.

Il serait plus exact de dire qu'un pointeur est un type de poignée, mais pas toutes les poignées sont des pointeurs.

Par exemple, une poignée peut également être un indice dans une table dans la mémoire, ce qui correspond à une entrée qui lui-même contient un pointeur vers un objet.

La chose principale est que lorsque vous avez une « poignée », vous ne prendra pas comment cette poignée se termine réellement identifier la chose qu'il identifie, tout ce que vous devez savoir est qu'il fait.

Il devrait également être évident qu'il n'y a pas de réponse unique à « ce qui est exactement une poignée », parce que les poignées à différentes choses, même dans le même système, peuvent être mises en œuvre de différentes manières « sous le capot ». Mais vous ne devriez pas avoir à se préoccuper de ces différences.

C ++ / CLI, une poignée est un pointeur vers un objet situé sur le tas de GC. Création d'un objet sur le tas (non géré) C ++ est obtenue en utilisant new et le résultat d'une expression de new est un pointeur « normal ». Un objet géré est alloué sur le GC (géré) tas avec une expression de gcnew. Le résultat sera une poignée. Vous ne pouvez pas faire de l'arithmétique de pointeur sur les poignées. Vous ne poignées pas libres. Le GC prendra soin d'eux. En outre, le GC est libre de déplacer les objets sur le tas managé et mettre à jour les poignées pour pointer vers les nouveaux emplacements alors que le programme est en cours d'exécution.

apparaît dans le contexte de la Poignée-corps-Idiom , aussi appelé langage Pimpl. Il permet de garder l'ABI (interface binaire) d'une bibliothèque même, en conservant les données réelles dans un autre objet de classe, qui est simplement référencée par un pointeur tenu dans un objet « poignée », composé de fonctions que délégué à cette classe " Corps".

Il est également utile pour permettre la constante de temps et exception échange sûr de deux objets. Pour cela, simplement le pointeur pointant vers l'objet du corps doit être échangé.

Une poignée est tout ce que vous voulez qu'il soit.

Une poignée peut être un entier non signé utilisé dans une table de consultation.

Une poignée peut être un pointeur sur, ou dans, un plus grand ensemble de données.

Cela dépend de la façon dont le code qui utilise la poignée se comporte. Qui détermine le type de poignée.

La raison pour laquelle le terme « poignée est utilisé est ce qui est important. Cela leur indique comme un type d'identification ou d'accès de l'objet. Ce qui signifie, pour le programmeur, ils représentent une 'clé' ou accès à quelque chose.

HANDLE hnd; est le même que void * ptr;

POIGNEE est un typedef défini dans le fichier winnt.h dans Visual Studio (Windows):

typedef void *HANDLE;

En savoir plus sur POIGNEE

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top