Wie löst man sowas am effektivsten?
-
Heho,
nehmen wir an ich habe n Objekte verschiedener Klassen, d.h. objekt A ist instanz von Klasse A1, Objekt B ist instanz von Klasse A2 usw, A1 und A2 hängen nicht weiter miteinander zusammen.
Wie organisiere ich diese Objekte mit dem geringsten aufwand?mit arrays von void zeigern? oder wie oder was? wenn ich nicht weiß welchen typ eine klasse haben wird, dann böten sich die ja an, aber die scheinen ja verpönt zu sein. Ansonsten n array von zeigern auf zeiger? oO
hoffe meine frage ist klar geworden, danke für eure antworten
^^
-
Diese Frage stellen sich merkwürdigerweise viele in C++. Doch zwei Gegenfragen: Wie willst du die einzelnen Elemente ansprechen, wenn du deren Typen nicht kennst? Wieso speicherst du sie nicht separat, wenn sie sowieso nichts miteinander zu tun haben?
Falls sie doch ein wenig miteinander zu tun haben, kannst du Polymorphie mit einer Basisklasse nutzen. Ansonsten gäbe es noch Boost.Any bzw. Boost.Variant, aber ich bezweifle, dass du das brauchst. Kannst du einen konkreten Kontext beschreiben, in dem sich deine Frage stellt? Würde mich noch interessieren...

-
Wenn du unbedingt alle Elemente so speichern musst/willst, dann ginge das über void Zeiger ja. Allerdings ist es sehr unwahrscheinlich, dass du das wirklich musst. Wenn du das nämlich machst, musst du, wenn du die Objekte wieder brauchen willst wiederen den richtigen Typ auswählen, was alleine über das void nicht so leicht geht. Das heisst, dass du das Laufzeittypsystem benutzen musst, was aber viel eleganter über Vererbung (und dann halt mit konkreten Zusammenhängen) geht.
-
vielen dank shconmal, ich muss gestehen, dass sie ein bisschen schon miteinander zu tun haben, jedoch wollte ich antworten wie "warum benutzt du dann nicht zeiger auf basis klasse" die sicher trotz suche nach anderen möglichkeiten gegeben worden wäre ^^
ok konkreter Fall:
ich versuche mich(aus reiner freude und zu übungszwecken) darin MUGEN(http://en.wikipedia.org/wiki/M.U.G.E.N.), eine beat em up engine, nachzuprogrammieren.
Dabei befindet sich ein Spieler immer in einem gewissen Zustand, einer "state".
Hier mal n beispiel codefetzen"[StateDef 200]
anim = 200
ctrl = 0
type = S
movetype = A ;*** Add this line ***
physics = S
velset = 0,0;*** Add this new block ***
[State 200, HitDef]
type = HitDef
trigger1 = Time = 0 ;Activate at time = 0 (start of state)
attr = S, NA ;Attributes of the HitDef (explained later)
damage = 30 ;Damage points to deal
;*** End of new block ***[State 200, 1]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1
"vom type der state hängt ab, welche codewörter man danach noch verwenden und definieren darf. Gäbe zwei Möglichkeiten mit Klassen das ganze nachzubilden:
entweder alle statetypen in einem, was aber ein ziemliches chaos wäre, oder wie du das angeschnitten hast und ich es machen wollte, jeder statetypus wird zu einer eigenen klasse mit ner simplen Basisklasse die nur die elemente "trigger" und "type" enthält.So, das werde ich vermutlich auch so tun, da du mir den tipp gegeben hast(den ich auch schon ergoogelt hatte :P). aber mich interessieren andere lösungen für so ein problem ^^(die engine ist btw ursprünglich in C mit allegro geschrieben worden)
-
Du könntest das ganze natürlich auch völlig dynamisch machen und z.B lediglich mit Strings arbeiten, die du dann halt irgendwie interpretierst.
Je nachdem, wie erweiterbar das ganze sein soll wäre das sicher eine Möglichkeit. Anderseits bieten sich da auch Skriptsprachen, wie z.B Lua an, die für solche Sachen recht praktisch sind.
-
Deinen Code verstehe ich nicht ganz (nicht zuletzt, weil es nicht C++ ist); zumindest erschliesst sich mir der Zusammenhang zur Frage nicht sofort.
Mit Klassen fährt man aber grundsätzlich nicht schlecht, wenn du mal einen Ansatz hast, kannst du ja immer noch weiter schauen. Je nach Anwendungsfall (wenn es eher um Daten(-sätze) geht) wäre vielleicht auch
std::mapeine Möglichkeit für Fallunterscheidungen.
-
@drakon das stimmt zwar, aber mich juckt immer die schnelligkeit davon^^ zwar ist das in meinem fall ziemlich egal, da die grafik sehr simpel ist, aber ich hab da quasi einen "geschwindigskeitsfetisch", versuch mich schon zu bremsen, da mir das noch realtiv egal sein darf.
Nun, der gepostete Code ist ein beispiel der skriptsprache besagter Engine, welchen ich interpretieren muss, da ich alten code wiederverwenden möchte.
Da es nur endlich viele statetypen gibt, und die sehr gut von beiliegenden dokumentne beschrieben werden, dachte ich mir ich baue einzelne klassen aus ihnen
-
Kingcools2 schrieb:
@drakon das stimmt zwar, aber mich juckt immer die schnelligkeit davon^^ zwar ist das in meinem fall ziemlich egal, da die grafik sehr simpel ist, aber ich hab da quasi einen "geschwindigskeitsfetisch", versuch mich schon zu bremsen, da mir das noch realtiv egal sein darf.
Das verstehe ich, allerdings würde ich mir da nicht allzuviele Gedanken machen, aber die Standardbibliothek und die Klassen sind normalerweise recht schnell. (So schnell, dass man praktisch nichts von ihnen spürt, wenn man eine Grafikanwendung hat. Im Relase natürlich).
Und die Entwicklungszeit, die du an Klassen kopieren usw. "verschwendest" könntest du ev. wo anderst gebrauchen, wenn du gleich etwas dynamischeres hast. Aber für den Lerneffekt kannst du es natürlich schon auch mit Klassen machen.

Wirst aber früher, oder später merken, was ich meine.
-
ok ^^ ich denk dann an dich, vielen dank euch beiden, werds dann mit der basisklasse probieren
