Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
template <typename t> class ProxyObj { public: ProxyObj(t** Obj): m_Obj(Obj) { } ProxyObj(ProxyObj<t>& Ref): m_Obj(Ref.Obj) { } bool IsValid() { return (*m_Obj)!=NULL; } t* operator->() { return *m_Obj; } t* operator*() { return *m_Obj; } protected: t **m_Obj; }; typedef ProxyObj<Character> CharacterRef; class WorldObjectRef : public ProxyObj<WorldObject> { public: WorldObjectRef(WorldObjectRef &Obj): ProxyObj<WorldObject>(Obj) { } WorldObjectRef(WorldObject** Obj): ProxyObj<WorldObject>(Obj) { } operator CharacterRef () { return CharacterRef(reinterpret_cast<Character**>(m_Obj)); } } |
Dafür scheint mir deine Vorgehensweise etwas sehr frickelig. Vererbung ist hier nicht der richtige Ansatz. Denn abgesehen davon, dass Vererbung zu viel Aufwand für nur einen Fall wäre, vergisst du eines: Nicht jedes ProxyObj<WorldObject> ist auch ein WorldObjectRef.Zitat von »"Jonathan_Klein"«
Also ich möchte ein ProxyObj<WorldObject> in ein ProxyObj<Character> casten können.
C-/C++-Quelltext |
|
1 |
ProxyObj<Character> ToCharacterProxyObj(const ProxyObj<WorldObject>&); |
Zitat von »"Nexus"«
Vererbung ist hier nicht der richtige Ansatz. Denn abgesehen davon, dass Vererbung zu viel Aufwand für nur einen Fall wäre, vergisst du eines: Nicht jedes ProxyObj<WorldObject> ist auch ein WorldObjectRef.
Auch ein typedef würde da nicht helfen. Du dürftest keine Instanzen mehr von ProxyObj<WorldObject> haben, sondern nur noch die der abgeleiteten Klasse WorldObjectRef.Zitat von »"Jonathan_Klein"«
Ja, das stimmt, aber da ich sonst eh ein typedef schreiben würde, wäre das kein Problem.
Dann biete doch entsprechende Getter und Setter an. Das ist immer noch viel sauberer als den Umweg über eine konzeptbrechende Vererbung. Selbst friend wäre noch sauberer.Zitat von »"Jonathan_Klein"«
Und wenn ich eine cast Funktion schreibe, nun dann müsste die auf private Member zugreifen. Ich könnte das evtl. mit friend umgehen, aber besonder toll finde ich das auch nicht.
Casts zwischen verwandten Klassentypen funktionieren nur bei einer Referenz oder einem Zeiger, was auch sinnvoll ist. Also warum brauchst du jetzt die Doppelzeiger (du hast wahrscheinlich mein letztes Edit nicht mehr gesehen)?Zitat von »"Jonathan_Klein"«
Character ist btw. von World Object abgeleitet und den reinterpret_cast hab ich, da weder static noch dynamic cast gehen wollte und ich nicht unbedingt einen C Cast machen wollte.
Hm, der scheint zu stimmen. Ich kann dir da auch nicht gerade helfen, bist du sicher, dass das den Fehler ausgelöst hat?Zitat von »"Jonathan_Klein"«
Aber selbst wenn ich das alles irgendwie umgehen könnte, wäre es interessant, was mit den Typen da nicht stimmen soll.
Zitat von »"Nexus"«
Wozu hast du überhaupt einen Doppelzeiger? Auch das ist sehr selten, gerade wenn man Container zur Speicherverwaltung einsetzt.
Zitat von »"Nexus"«
Auch ein typedef würde da nicht helfen. Du dürftest keine Instanzen mehr von ProxyObj<WorldObject> haben, sondern nur noch die der abgeleiteten Klasse WorldObjectRef.
Zitat von »"Nexus"«
Ich kann dir da auch nicht gerade helfen, bist du sicher, dass das den Fehler ausgelöst hat?
C-/C++-Quelltext |
|
1 2 3 4 |
if(MyObj) { //Objekt ist gültig, oder nicht leer, oder sonst was } |
Zitat von »"Jonathan_Klein"«
Und wo wir gerade schon beim casten sind: Wäre operator bool() das Mittel der Wahl, wenn man haben möchte:
Das verstehe ich jetzt nicht ganz. Wozu überhaupt zwei Zeiger, geht das Ungültig-Machen nicht mit einem? Willst du mehrere Objekte darin speichern? Falls ja, würde ich zu Containern raten. Ansonsten scheint mir kein Grund für Doppelzeiger einzufallen.Zitat
Damit ich z.B. den ersten Zeiger auf NULL setzen kann, falls da Objekt gelöscht wird und somit direkt sämtliche ProxyObjekte wissen, dass das, worauf sie zeigen, ungültig geworden ist.
Nein, macht sie nicht. -> Safe Bool IdiomZitat von »"PCShadow"«
ja, die streambiliothek machts ja auch so
Dem stimme ich vollständig zu. Ich würde mir das wirklich nochmals überlegen. Auch wenn es momentan funktioniert, ist es alles andere als schön und unnötig kompliziert. Und mit dem reinterpret_cast auch noch zusätzlich fehleranfällig...Zitat von »"Fred"«
Ich würde dir auch dringend empfehlen das ganze über eine entsprechenede Cast-Funktion zu regeln. Die Membervariablen veränderst du durch set-Methoden und schon geht das ganze sehr sauber von der Hand. Denn die Lösung, die du momentan hast, würde ich als äußerst unsicher beschreiben und sie ist sicher alles andere als optimal.
Werbeanzeige