pointer typ und design
-
hallo,
diesmal frage ich vorher bevor ich irgendein scheiss implementiere.
also der user soll bei meiner engine auswählen welchen camera typ er benutzen möchte. ich habe zwei kamera typen die beide von einer basisklasse erben. allerdings hat zum beispiel die egocam noch einige zusätzliche methoden die die "freie camera" nicht besitzt.
in meinem engine objekt habe ich einen pointer auf die basisklasse, nachdem der user eine camera gewählt hat wird dieser dann entsprechend gesetzt und nun will ich verhindern das der user methoden aufruft die es der gesetzen camera gar nicht gibt.
das ganze stelle ich mir so vorclass CBaseCamera{ public: CBaseCamera(); virtual ~CBaseCamera() {} virtual void Update(float fTimeElapsed) = 0; // gibt es nur bei ego cam virtual CVector GetRotation() {} }; class CFreeCamera : public CBaseCamera { public: CFreeCamera(); ~CFreeCamera(); void Update(float fTimeElapsed); }; class CEgoCamera : public CBaseCamera { public: CEgoCamera(); ~CEgoCamera(); void Update(float fTimeElapsed); CVector GetRotation(); // engine.cpp CBaseCamera *m_pCamera; short CEngine::SetCameraType(eCameraType eType) { if(eType == CT_FREE) m_pCamera = new CFreeCamera(); else if(eType == CT_EGO) m_pCamera = new CEgoCamera(); // usw ... return OK; } short CEngine::GetEgoRotation(CVector &vRot) { // hier sollte überprüft werden ob der pointer gesetzt wurde // falls ja auf welchen cameratyp ? vRot = m_pCamera->GetRotation(); return OK; }
meine fragen:
1. wäre das design ok ? wenn nein lösungsvorschläge
2. wie überprüfe ich den pointertyp ohne zusätzliche variable
-
Hallo!
Das sieht mir ein bißchen aus wie "Sinn und Zweck von Vererbung nicht verstanden".
Man erbt doch um verschiedene Objekte gleich behandeln zu können, nicht um danach ständig zu unterscheiden welches wohl welches ist. Sobald solche switches über den Typen gehäuft auftreten ist das ein sicheres Zeichen dafür, daß im Design was faul ist. Das von vornherein so zu planen halte ich für nen dicken Fehler.
Versuch lieber das Interface der Kamera vollständig zu machen, so daß sie alles kann und die beiden Klassen implementieren das dann leicht unterschiedlich.
MfG Jester
-
Ich würde es so machen:
Um zu prüfen ob der pointer gesetzt wurde folgende Zeile ändern:
CBaseCamera *m_pCamera = NULL;
Prüfen:
if ( m_pCamera != NULL ) //Ist pointer gesetzt?
Zum Thema prüfen welcher:
Da du schon angefangen hast virtuel zu programieren solltest du es so lösen das du diese Abfrage nicht brauchst.
Ich mache das dann so das ich immer alle methoden in den abgeleiteten Klassen gibt.Werden si aber nicht gebraucht steht nur ein return 0 drin.
-
sie sollte schon ziemlich viel machen wie zb: setzen der position, richtung usw.
allerdings wie schon gesagt gibt es halt ein paar ausnahmen.Jester schrieb:
Versuch lieber das Interface der Kamera vollständig zu machen, so daß sie alles kann und die beiden Klassen implementieren das dann leicht unterschiedlich.
kannst du mir vielleicht das näher erklären ?
sven1978 schrieb:
CBaseCamera *m_pCamera = NULL;
if ( m_pCamera != NULL ) //Ist pointer gesetzt?
so dachte ich mir das bis jetzt auch, allerdings 0 immer zurückzugeben fand ich nicht so gut, vorallem wenn der user ohne diesen wert zu überprüfen weiterrechnet kann es probleme geben (div durch 0)
-
miller_m schrieb:
Jester schrieb:
Versuch lieber das Interface der Kamera vollständig zu machen, so daß sie alles kann und die beiden Klassen implementieren das dann leicht unterschiedlich.
kannst du mir vielleicht das näher erklären ?
Ich würd's Dir gern an Deinem Beispiel verdeutlichen.
Allerdings fällt mir momentan keine Funktionalität ein, die bei einer Ego-Kamera gebraucht wird und bei ner freien nicht. Vielleicht kannst Du mal ein Beispiel für sone Funktion geben, bei der Du verhindern willst, daß man sie mit der falschen Kamera aufruft.MfG Jester
-
Ich kann mich da bloss an die Ausage von Jester anschliesen:
Man erbt doch um verschiedene Objekte gleich behandeln zu können, nicht um danach ständig zu unterscheiden welches wohl welches ist. Sobald solche switches über den Typen gehäuft auftreten ist das ein sicheres Zeichen dafür, daß im Design was faul ist. Das von vornherein so zu planen halte ich für nen dicken Fehler.
[qoute]
so dachte ich mir das bis jetzt auch, allerdings 0 immer zurückzugeben fand ich nicht so gut, vorallem wenn der user ohne diesen wert zu überprüfen weiterrechnet kann es probleme geben (div durch 0)
[/quote]Das ist auch nur eine Ausnahme. Normal Programiere ich so das jede methode eine Funktion hat.
Das ist der sinn der polymorphi(so schreib man es glaub).
Zum Thema NULL : Das würde ich immer so machen. Jeden Zeiger erstmal auf NULL setzen.Dann kanst du dir sicher sein das kein Mist hinter dem zeiger steht.
Und um ein paar if abfragen ob ein pointer gesetzt ist kommst du wohl nicht rum
-
da ich natürlich auch nix habe, nur meine gedanken und notizen
aber zum bespiel "strafen" darf es ja nur bei einer ego geben und freien (zb: flugzeugsim) gibt es ja sowas nicht
class CBaseCamera{ public: CBaseCamera(); virtual ~CBaseCamera() {} virtual void Strafe(float fStrafe) {} }; class CFreeCamera : public CBaseCamera { public: CFreeCamera(); ~CFreeCamera(); }; class CEgoCamera : public CBaseCamera { public: CEgoCamera(); ~CEgoCamera(); // gibt es nur hier void Strafe(float fStrafe); };
wäre in dem fall egal diese auch noch in der freecam zumachen das ich keinen rückgabewert habe
-
sven1978 schrieb:
Zum Thema NULL : Das würde ich immer so machen. Jeden Zeiger erstmal auf NULL setzen.Dann kanst du dir sicher sein das kein Mist hinter dem zeiger steht.
Und um ein paar if abfragen ob ein pointer gesetzt ist kommst du wohl nicht rum
das mache ich natürlich auch so
-
Wieso soll eine freie Kamera sich nicht seitwärts bewegen dürfen?
Ob sich die Kamera allerdings seitwärts bewegt, das hängt wohl eher von demjenigen ab, der die Kamera führt. Generell sehe ich aber nicht, was gegen ein MoveRight/MoveLeft bei einer freien Kamera sprechen würde. Damit kannst Du die Funktionalität in die Basisklasse aufnehmen.
-
Jester schrieb:
Wieso soll eine freie Kamera sich nicht seitwärts bewegen dürfen?
Ob sich die Kamera allerdings seitwärts bewegt, das hängt wohl eher von demjenigen ab, der die Kamera führt. Generell sehe ich aber nicht, was gegen ein MoveRight/MoveLeft bei einer freien Kamera sprechen würde. Damit kannst Du die Funktionalität in die Basisklasse aufnehmen.ok mal angenommen ich finde einen gemeinsamen nenner, wäre wohl nichts mehr gegen das design zu sagen. oder ?
-
Nö, absolut nicht.