Du bist nicht angemeldet.

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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

16.11.2013, 18:34

Es geht darum, dass Du eine Typ-Prüfung machst, was schon mal schlecht ist. Und dass die wegen fehlender RTTI "im Normalfall" eh nicht funktioniert, macht die Sache noch schlechter.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

16.11.2013, 22:04

Das dynamic_cast ein Zeichen für schlechtes Design ist, weiß ich. Allerdings fällt mir keine gute Möglichkeit ein, meine Anforderungen anders umzusetzen.

Und wir werden dir auch keine bessere Möglichkeit vorschlagen können, so lange du uns du deine Anforderungen nicht verrätst... ;)

Könnt ihr mir vll aufzeigen unter welchen Umständen oben genannte Lösung Probleme machen könnte?
Ich sehe dabei lediglich Problem beim Ändern der Klasse (hinzufügen von Membern).

Obiger Code ist keine richtige Lösung, sondern Symptombehandlung. Das eigentliche Problem ist wohl dort zu suchen, wo du versuchst, Dinge, die offenbar nicht zusammengehören, mit Gewalt zusammenzufassen. Eine richtige Lösung wäre, dein Design so abzuändern, dass es dein Vorhaben unterstützt, anstatt dir Steine in den Weg zu legen...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (16.11.2013, 23:03)


13

18.11.2013, 09:32

Ok, erstmal danke für die Antworten.
Um das ganze mal ein wenig zu visualisieren, hier ein kleines Bild

(Link)


Wie man sieht, gibt es viele, viele Objects, welche jeweils einen passenden Container besitzen (zumindest stellt er die passenden getItem und setItem Methoden zur Verfügung, der eigentliche vector typ ändert sich nicht).
Allerdings werden alle Objecte als "Object" Pointer gespeichert, und nicht beispielsweise als "DerivedObject1" Pointer.
Die Container werden nun in einer allgemeinen "Manager" Klasse gespeichert. Hier werden ebenfalls lediglich Pointer auf die Basisklasse benutzt.
Natürlich sind alle diese Pointer unique_ptrs (das aber nur am Rande, bevor einer meckert ;))!
Jetzt bekomme ich aber natürlich in der Container-Basisklasse das Problem, das ich den richtigen Typ meines Objects nicht kenne. Möchte ich hier also ein Object kopieren, bekomme ich beschriebenes Object Slicing (jetzt natürlich logisch).

Kommen wir also zu meinen Anforderungen:
- keine Copy-Paste Klassen der Container (Grundstruktur soll über Basisklasse geregelt werden, getter und setter über Derived)
- sichergestellt, das nur die richtigen Objecte in den Container Klassen landen (kein DerivedObject1 in DerivedContainer2)
- Container innerhalb der Managerklasse durch einen Index referenzierbar bleiben

Das obige Design ist auch so umgesetzt und funktioniert, aber eben mit Schwächen. Vll ist es jetzt ein wenig klarer, was ich eigentlich möchte ;)

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

14

18.11.2013, 09:55

Kann deine Container-Basisklasse nicht den richtigen Objekttyp als Templateparameter bekommen?
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

15

18.11.2013, 10:03

Das wäre ja Prinzipiell möglich, aber dann könnte ich die Container-Klassen nicht in der Manager-Klasse als Container speichern.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

16

18.11.2013, 10:09

Arbeitet der Manager direkt mit den Objekten? Falls nein, würde ich ggf. ein IContainer-Interface anbieten, dass von Container implementiert wird und alles anbietet, was der Manager vom Container braucht.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

17

18.11.2013, 10:14

Nein, er bietet lediglich Zugriff auf die Container. Mit den Objecten an sich, hat er nichts am Hut ;)

EDIT: Eigentlich keine schlechte Idee.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

18.11.2013, 10:25

Jetzt bekomme ich aber natürlich in der Container-Basisklasse das Problem, das ich den richtigen Typ meines Objects nicht kenne. Möchte ich hier also ein Object kopieren, bekomme ich beschriebenes Object Slicing (jetzt natürlich logisch).

Und genau das ist normalerweise das erste Anzeichen dafür, dass entweder das Object Interface keine passende Abstraktion bietet oder die verschiedenen Dinge, die du alle unter einem Object zusammenfassen willst, nicht zusammengefasst werden sollten. Denn in dem Moment, wo du nurmehr von Object sprichst, anstatt vom konkreten Typ, sagst du ja ausdrücklich, dass der konkrete Typ dich nicht interessiert. An den Punkt, wo du ein Object hast, aber eigentlich gerne den konkreten Typ haben würdest, kommst du dann, wenn dein Design in sich widersprüchlich ist. Wenn es nur ums Kopieren geht: Gib deinem Object Interface eine clone() Methode. ;)

Du hast uns nun zwar sehr schön eine abstrakte Beschreibung deiner Lösung für ein uns unbekanntes Problem gegeben, interessant wäre allerdings vor allem eben auch das konkrete Problem, das damit gelöst werden soll. Was sind diese Object Dinger, wofür die Container und warum die Manager Klasse? Was ist der konkrete Zweck des Ganzen? Ohne das zu wissen, kann zumindest ich keinen sinnvollen Vorschlag machen, was man vielleicht wie besser lösen könnte...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (18.11.2013, 10:30)


19

18.11.2013, 10:57

Danke für den interessanten Beitrag ;)
Ich will das jetzt nicht auf das Kopieren spezifizieren, deswegen suche ich nach einer allgemeineren und besseren Lösung.

Das Ganze stellt die interne Verwaltung meiner Spieldaten da. Die einzelnen Container sind praktisch Datenbanken, in denen ich Objecte anhand ihrer ID referenziere. Da viele Objecte aufeinander aufbauen, entsteht hier eine gewisse Polymorphie (Jedes Object hat eine ID und einen Namen. Die Klassen "Sound" und "Texture" sind beides "Ressourcen" aber verweisen auf komplett andere Dinge).
Um das Ganze nun dynamisch verwalten zu können, ist das obige Konzept entstanden. Da ich dem User später (also dem Nutzer der entsprechenden Intefaces) die Möglichkeit bieten möchte, seine eigenen Datenbanken in den Manager zu schieben, fallen hardcoded Member weg.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

18.11.2013, 11:59

Virtuelle Clone-Methoden sind hier irgendwie meiner Meinung nach der sinnvollste Ansatz. Genau wie eventuell auch virtuelle Serialize/Deserialize Methoden. Ich wüsste sonst nicht, wozu der Manager die konkreten Typen wissen müsste, wenn er doch eigentlich gar keine konkreten Typen will.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige