2012-04-06 7 views
1

Ich versuche derzeit, ein Eigenschaftssystem zu entwerfen, um Mitgliedsvariablen einiger Klassen an einen Serializer zu binden, und ich möchte den geringstmöglichen Code für jede Bindung schreiben und dennoch flexibel sein.C++ - Membervariable binden: Getter/Setter oder roher Zeiger?

Ich denke, Getter/Setter sind die meiste Zeit nicht wirklich notwendig, also würden sie nur verwendet werden, wenn sie tatsächlich etwas auslösen. Die Klassen würden eine Liste von Variablennamen und entweder einen Zeiger auf die Variable, entweder einen Zeiger auf Getter/Setter, bereitstellen.

Meine Fragen sind:

  • durch Zeiger tatsächlich gefährlich oder sogar moralisch bindend?
  • Können diese Klassen diese Zeiger geben, ohne ihre tatsächliche Instanz zu kennen? (Binden Sie die Informationen einmal für alle Instanzen jeder Klasse ein und speichern Sie diese irgendwo). AFAIK, Boost :: bind lässt das nicht zu.

Antwort

0

Dangerous ja, unmoralisch nicht. Sie können die Klassen dazu bringen, Freunde des Serialisierers zu sein und das verbindliche Material für Sterbliche zu verbergen, um die Sicherheit zu verbessern, dann haben Sie eine Reihe verwandter Klassen, denen es moralisch erlaubt ist, über die interne Struktur jedes anderen zu wissen.

Die Klasse kann die Bindungsinformationen definitiv zurückgeben, z. B. als Byte-Offsets. Es kann jedoch am einfachsten sein, wenn die Klasse ein "Prototyp" -Objekt dieser Klasse besitzt (d. H. Ein statisches Element seines eigenen Typs). Dann erhalten Sie die Byte-Verschiebung für das Feld, indem Sie die Adresse eines Prototypfelds als const char * erhalten und von der Adresse des Prototyps auch als const char * subtrahieren.

Natürlich müssen Sie dann sicherstellen, dass Sie wissen, welcher Typ das Feld ist, damit Sie die Daten bei einem Byte-Offset korrekt bearbeiten können (z. B. zurück zum richtigen Zeigertyp).

Es gibt jedoch viele Probleme bei der Implementierung von etwas wie diesem, die hauptsächlich darum gehen, sicherzustellen, dass Sie den richtigen Zeigertyp beim Serialisieren haben, anstatt einen Zeiger auf ein Teilobjekt innerhalb des Objekts.