Was ist eine undurchsichtige Wert in C++?
Was ist eine "undurchsichtige Wert" in C++?
- Etwas mehr Kontext?
- Überprüfen Sie diesen link könnte dir helfen - calumgrant.net/opaque/index.html
- warum ist diese Frage tagged as sprachunabhängig?
- Da opaken Objekten sind Häufig über viele Sprachen.
- Es bedeutet nur, Sie können nicht sehen, was innen (also undurchsichtig).
- York... also sollte die Frage so geschrieben: "Was ist ein 'opaque Wert'?
- Finden Sie die Zusammenfassung für die revision. Ich wollte nicht, entfernen Sie die C++ - Kontext, weil das ist, wie der OP gefragt, aber es gilt noch für nahezu alle anderen Sprachen.
- Best practice zu deklarieren: stackoverflow.com/questions/3965279/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein Beispiel für eine Opake Wert ist
FILE
(aus der C-Bibliothek):Erhalten Sie eine
FILE
Zeiger ausfopen()
, und verwenden Sie es als parameter für andere Funktionen, aber Sie nie die Mühe mit dem, was es eigentlich Punkte zu.FILE
Sie nur geben Sie es herum. Wenn Sie nicht herausfinden konnte, seinen Inhalt in den Header könntest du noch reverse-engineer, aber Sie haben nicht zu, da seine Struktur nicht von Bedeutung. Die Bibliothek Implementierer könnte sich ändern, seine Interna, ohne weitere Benachrichtigung, und es sollte keinen Unterschied machen. (Es sei denn, natürlich, Sie hat hack in seine interne Struktur.) Nicht zu verwechseln mit der Leichtigkeit der Zugang mit Barrierefreiheit. C++private
Daten der Mitglieder sind nicht "unsichtbar" entweder...stdlib.h
FILE
,fopen
,NULL
,fprintf
,fclose
... sorry, das ist alles instdio.h
, die I enthalten.fopen
Funktion ist instdlib.h
- Datei im college-Prüfung und ich habe noch Marken für das. Musste bestätigen Sie mit der Dozentin.FILE *x
arbeiten würde, aber nichtFILE x
. Da die standard-Mandate nur die erste fürstdio
, das ist okay. Aber selbst wenn es Sie noch nicht gab, konnte man noch definierenFILE
als ein char-array zu verstecken den Inhalt und warf es auf die Reale Struktur innerhalbfread/fwrite/etc
. Das würde zeigen nur die Größe.struct file;
ist ein declaration (ich erkläre, dass diese Sache existiert, und definieren Sie es an anderer Stelle), anstatt ein definition (definiere ich den Sinn dieser Sache hier).FILE
werden muss verschleiert in Erster Linie, und denke, es ist irreführend und unnötig verkompliziert das Problem. Das ist der Punkt: ich fühle mich nicht deine edits hinzufügen auf die Antwort. Fühlen Sie sich frei, um eine Antwort der eigenen."Undurchsichtig" ist definiert, in Englisch, wie "nicht in der Lage zu sehen durch; nicht transparent". In der informatik bedeutet dies einen Wert, der verrät keine details, die andere dann den Typ der Wert selbst.
Menschen oft die C-Typ
FILE
als das klassische Beispiel, aber oft ist dies nicht undurchsichtig - die details sind offenbart instdio.h
für jedermann zu sehen, und Sie verlassen sich einfach auf die Benutzer des Typs nicht Geige mit den Interna. Das ist in Ordnung, solange die Menschen an die Regeln halten, nur die übergabe solcher Werte an Funktionen wiefread()
undfclose()
aber das problem mit Informationen ist, dass die Menschen manchmal (dummerweise) beginnen auf Sie verlassen.Beispielsweise
glibc
veröffentlicht seineFILE
Struktur (struct _IO_FILE
) inlibio.h
so, der Typ ist technisch nicht deckend.Beachten Sie, dass ein Teil der definition an die front: "nicht in der Lage" eher als "nicht bereit". Deckkraft benötigt die Informationen ausgeblendet werden, anstatt nur den Erlass einer "gentleman' s agreement" nicht zu verwenden.
Undurchsichtigen Zeiger, richtig gemacht, sollte zeigen keine andere Informationen als der name selbst und können Sie implementieren, die in C relativ leicht. Betrachten Sie die folgende header-Datei
prog2.h
für die Beschaffung und die Freigabexyzzy
Objekte:Dies ist alles, was die Kunden von dem code zu sehen, ein unvollständiger Typ
struct xyzzy
und einige Funktionen zum reservieren und freigeben von Objekten dieses Typs (die Sie nicht bekommen, um zu sehenprog2.c
unten). Beachten Sie, dass Zeiger auf eine unvollständige Art sind gut, aber Sie kann nicht instanziiert ein Objekt dieses Typs, da Sie nicht wissen, seine Interna. Also der code:einen Fehler verursachen, entlang der Linien von:
Können Sie jetzt ganz glücklich, verwenden Sie diese Funktionen aus einem Programm
prog1.c
ohne die Kenntnis der Interna der Struktur:Und die Umsetzung der Anrufe
prog2.c
eigentlich steuert und weiß die Interna, so können Sie ganz frei:Den
printf
anrufen gibt es einfach zu zeigen, dass Sie es verwenden können, die Interna, und Sie würden wahrscheinlich hinzufügen möchten, prüfen des Rückgabewerts vonmalloc
im production-ready code, aber das ist nicht relevant für den Zweck der in diesem Beispiel.Beim kompilieren
prog1.c
undprog2.c
in einer einzigen ausführbaren Datei und führen Sie es aus, die Ausgabe ist:als Sie erwarten würden von der main-Funktion.
prog2.c
ich hätte in der Lage sein, um den Zugriff auf die Interna der Struktur. Ist die Struktur immer noch "undurchsichtig", die durch Ihre definition dann? Oder gibt true Deckkraft benötigen eine closed-source-Programmier-Modell? (Ziehen Sie Ihr Bein da, versucht zu zeigen, um meine definition von "Deckkraft" mit Blick auf die Dokumentation, nicht die header-Quelle. 😉 )prog2.c
Sie könnte prüfen, die Assembler-code, um es herauszufinden. In der Tat, der einzige Weg, um wirklich zu verstecken, ist es nicht loslassen, die eher Schäden Ihrem nutzen. Und eine vollständig definierteFILE
innerhalb von stdio.h könnte werden als undurchsichtig, um Menschen, die keine Ahnung haben wie man die header 🙂FILE
deckend ist (nach paxdiablo und deine definition) ist ganz bis zur Umsetzung (weil Sie könnte leicht anwenden paxdiablo die Technik zuFILE
auch). Sie könnten auch beachten Sie, dass, während sich uneins über das Thema, paxdiablo und ich waren in der Lage zu tun, ohne unhöflich und ruft jede andere "falsch" oder "eigensinnig". Plus, meine Antwort ist älter als das eins mit einem komfortablen Vorsprung, so dass es nichts gibt, muss ich "zugeben" hier.Ähnlich opake Zeiger - ein Wert, der keine Daten speichern, könnte der code interpretieren oder Ihnen Zugang zu Daten, sondern nur identifiziert einige andere Daten. Ein typisches Beispiel ist ein Win32-handle wie
HBITMAP
bitmap-handle - können Sie nur geben Sie Sie an entsprechende Funktionen, aber Sie können nicht alles tun, um die zugrunde liegende bitmap direkt.DATEI* ist ein gutes Beispiel für eine opake Wert. Sie verwenden Sie es nicht direkt; es ist ein einziges "blob", die Sie nicht interpretieren oder manipulieren. Stattdessen verwenden Sie eine Reihe von Funktionen (fopen, fwrite, fprintf, etc.) die wissen, wie Sie zu manipulieren.
Wird deckend auf diese Weise ist Häufig zu vielen Situationen (und in vielen APIs) wo haben Sie einen "magischen" Griff: black-box.
vom Wikipedia