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

1

23.12.2011, 09:27

friend class vererbung

hallo liebe freunde der nacht,

ich hab eine frage bzgl. friend class, da dies nicht so funktioniert wie ich es mir erwartet hätte bzw. ich mir eingebildet hätte, dass es funktioniert.

es geht um folgendes:
ich habe eine abstrakte klasse gameobj, die wie folgt aussieht:
- public constructor
- public addref/release für angelscript
- public destroy (hat auch wegen angelscript gründe)
- protected virtual destructor (wobei der auch public sein kann, da man von gameobj keine instanz erstellen kann
- protected variablen für referencecount(angelscript), scriptobject (angelscript) und objectid (für mich selbst zum vergeben einzigartiger ids an spielobjekte) [sollten eigentlich private werden]

nun habe ich klassen, die von gameobj erben, sagen wir eine klasse unit für einheiten und eine klasse ability für einheitenfähigkeiten.

zusätzlich kommt jetzt ein gameobjmanager hinzu, der für die erstellung/entferung von spielobjekten zuständig ist. dieser erzeugt dabei die oben angesprochene einzigartige id und erstellt wenn nötig das scriptobject für die angelscriptanbindung.

mein ziel wäre es nun gewesen, dass der manager zugriff auf die protected[sollten ja eigentlich private werden] variablen von gameobj hat, da nur der manager die id vergibt und das scriptobject erzeugt. ebenfalls benötigt nur der manager die id zum schnellen suchen/löschen/usw. von einzelnen objekten.

meine idee war nun, dass gameobjmanager mit dem keyword friend eine freundklasse von GameObj wird und dadurch auf die derzeit protected variablen id, scriptobj zugreifen kann. wenn ich das jedoch mache, wird beim compilen ein fehler geworfen, dass gameobjmanager nicht auf die protected variablen von gameobj zugreifen darf.

habe ich da irgendetwas missverstanden?

lg

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

23.12.2011, 09:33

Ist eine Ability ein GameObject? Ich denke nicht.

Ich finde es auch keine gute Idee die Member-Variablen direkt dem Manager zugänglich zu machen. Er sollte die üblichen und vernünftigen Get/Set Methoden nutzen. Friend halte ich hier für schlechtes Design.
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]

3

23.12.2011, 10:45

Ist eine Ability ein GameObject? Ich denke nicht.

Ich finde es auch keine gute Idee die Member-Variablen direkt dem Manager zugänglich zu machen. Er sollte die üblichen und vernünftigen Get/Set Methoden nutzen. Friend halte ich hier für schlechtes Design.


gameobject ist eher ein temporärer überbegriff, weil mir nichts besseres einfällt. der manager ist jedenfalls für folgende klassen zuständig was erstellen/aufräumen/suchen/etc. anbelangt:
- player
- unit
- hero
- ability
- buff
- item

mehr "objekte" gibt es vorerst im spiel nicht, damit lässt sich aber eh schon einiges anstellen.

set/get methoden will ich in diesem fall eigentlich nicht, da es eigentlich werte sind, die nur einmalig gesetzt werden. die id könnte ich in nem konstruktor mitgeben, aber mit dem scriptobjekt funktioniert das nicht. das objekt muss vorher schon erstellt sein um ein scriptobjekt dafür anlegen zu können, weshalb man den versuch mit konstruktorübergabe imo verwerfen kann, wenn es nur für die id funktionieren würde.
set finde ich dann eben auch nicht schön, weil set für mich immer dafür da ist, wenn ich mehrmals set aufrufen kann/muss. für ein einmaliges setzen einer variable gefällt es mir eigentlich nicht so. scriptobj muss z.b. auch von außerhalb nie zugänglich sein, weshalb ich dafür auch keinen getter bräuchte. die id selbst bräuchte nur ein get, da man die nicht mehr verändern können sollte, wenn sie zugewiesen wurde.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

23.12.2011, 11:14

Dann nenn die Methoden vernünftig. Z.B. "initialize" und wirf eine Exception, wenn jemand versucht ein initialize aufzurufen, obwohl das schon geschehen ist. Init-Methoden sind zwar oft ein Fehlkonzept, weil dafür der Konstruktor da sein sollte, wenn sich dieser aber nicht so nicht aufrufen lässt (was ich ehrlich gesagt bezweifle, sonst ist da auch wieder irgendwo ein Fehldesign), dann muss es in diesem Fall so gehen.
Friend halte ich jedenfalls noch immer für die denkbar schlechteste Lösung für das Problem.
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