Frage

Ich habe gesagt, dass ein Griff Art eines Zeigers ist, aber nicht, und dass es erlaubt Ihnen, eine Referenz auf ein Objekt zu halten, anstatt das Objekt selbst. Was ist eine aufwendigere Erklärung?

War es hilfreich?

Lösung

Ein Griff kann alles von einem ganzzahligen Index auf einen Zeiger auf eine Ressource im Kernelraum. Die Idee ist, dass sie eine Abstraktion einer Ressource zur Verfügung stellen, so müssen Sie nicht viel wissen über die Ressource selbst, es zu benutzen.

Zum Beispiel die HWND in dem Win32-API ist ein Handle für ein Fenster. An sich ist es nutzlos: Sie daraus keine Informationen sammeln können. Aber geben sie an die richtigen API-Funktionen, und Sie können eine Fülle von verschiedenen Tricks mit ihm durchführen. Intern können Sie denken an dem HWND als nur einen Index in die Tabelle des GUI von Fenstern (die seine nicht unbedingt, wie es umgesetzt, aber es macht den Zauber Sinn).

EDIT: Nicht 100% sicher, was speziell in Ihrer Frage, die Sie fordern. Dies ist vor allem redet über reine C / C ++.

Andere Tipps

Ein Handle ist ein Zeiger oder Index ohne sichtbare Art daran befestigt. Normalerweise sehen Sie so etwas wie:

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

Also in Ihrem Code, den Sie passieren nur als opaken Wert GREIFEN um.

Im Code, der das Objekt verwendet, es wirft den Zeiger auf eine reale Strukturtyp und verwendet sie:

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

oder er verwendet es als Index auf ein Array / Vektor:

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

Ein Griff ist eine Art Zeiger, dass es in der Regel eine Möglichkeit, etwas Entität verweisen.

Es wäre genauer zu sagen, dass ein Zeiger eine Art von Griff, aber nicht alle Griffe sind Zeiger.

Zum Beispiel kann ein Griff auch einige Index in ein in Speichertabelle sein kann, die zu einem Eintrag entspricht, der sich um einen Zeiger auf ein Objekt enthält.

Das Wichtigste ist, dass, wenn Sie ein „Griff“ haben, können Sie weder wissen noch egal, wie damit umgehen tatsächlich endet die Sache zu identifizieren, dass sie identifiziert, alles, was Sie wissen müssen, ist, dass es funktioniert.

Es sollte auch klar sein, dass es zu „was genau ist ein Griff“ keine einfache Antwort ist, weil Griffe, um verschiedene Dinge, auch im selben System auf unterschiedliche Weise „unter der Haube“ implementiert werden kann. Aber Sie sollten nicht mit diesen Unterschieden betroffen sein müssen.

In C ++ / CLI, ist ein Handle ein Zeiger auf ein Objekt auf der GC-Heap befindet. Erstellen eines Objekts auf der (nicht verwalteten) C ++ heap erreicht wird new und das Ergebnis eines new Ausdruck verwendet, ist ein „normaler“ Zeiger. Ein verwaltetes Objekt auf dem GC zugeordnet wird (verwaltet) heap mit einem gcnew Ausdruck. Das Ergebnis wird ein Griff sein. Sie können keine Zeigerarithmetik auf Griffe tun. Sie tun nicht frei Griffe. Die GC wird sich um sie kümmern. Auch die GC ist freie Objekte auf dem verwalteten Heap zu verlagern und die Griffe aktualisieren, um die neuen Standorte Punkt, während das Programm ausgeführt wird.

Dies wird im Rahmen der Griffkörper-Idiom auch Pimpl Idiom genannt. Es erlaubt es, das gleiche das ABI (Binärschnittstelle) eine Bibliothek zu halten, durch die tatsächlichen Daten in einer anderes Klassenobjekt zu halten, die nur durch einen Zeiger in einem „Griff“ Objekt gehalten verwiesen wird, die aus den Funktionen, die Delegierten zu dieser Klasse " Körper".

Es ist auch nützlich konstante Zeit und Ausnahme sicher Swap zweier Objekte zu ermöglichen. Dazu nur der Zeiger auf den Körper Objekt zeigt muss ausgetauscht werden.

Ein Handle ist, was Sie wollen, es sein.

Ein Griff kann eine ganze Zahl ohne Vorzeichen in einiger Lookup-Tabelle verwendet werden.

Ein Griff kann ein Zeiger auf bzw. in eine größere Menge von Daten.

Es hängt davon ab, wie der Code, der den Griff verhält verwendet. Das bestimmt den Griff Art.

Der Grund, der Begriff ' handle ' verwendet, ist das, was wichtig ist. Das zeigt sie als Identifikations- oder Zugang Art des Gegenstandes. Das heißt, für den Programmierer, stellen sie einen 'Schlüssel' oder Zugriff auf etwas.

HANDLE hnd; ist die gleiche wie void * ptr;

Handle ist ein typedef in der winnt.h Datei definiert in Visual Studio (Windows):

typedef void *HANDLE;

Lesen Sie mehr über GRIFF

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top