Programmdesign
-
Hallo zusammen, ich stehe vor folgendem Problem:
Ich habe eine Basisklass KRV_Object von welcher alle übrigen Klassen abgeleitet sind. Nun habe ich einen KRV_ObjectManager welcher intern als Vector funktioniert. Nun habe ich die Klassen KRV_Light, KRV_Camera, KRV_Window, KRV_Component und KRV_Resource von KRV_Object abgeleitet. Für jede dieser Klassen ist auch ein eigener Manager erforderlich. Nun möchte ich natürlich, dass man z.B. dem KRV_CameraManager auch nur instanzen vom Typ KRV_Camera übergeben können. Dafür muss ich aber jeweils für alle Methoden von KRV_ObjectManager eine neue Methode schreiben um die Typensicherheit zu gewährleisten. Gibt es denn da keine andere Möglichkeit ? Templates sind leider nicht drinn, da der ObjectManager auf Methoden der Basisklasse KRV_Object angewiesen ist.Gruss Ishildur
-
Wo ist der Bezug zu WinAPI?
-
Was stellt das KRV da? sieht für mich nach einem namespace aus.
ein Object als Basisklasse ist unklug, da Window und CameraManager nix miteinander zu tun haben. Ich glaube du kommst mit statischer Polymorphie (templates) genauso gut aus wie mit dynamischer. Oder ändern sich die Typen zur Laufzeit?
ich sehe aber das Problem nicht.
Wenn man nur CameraManager nur eine Camera übergeben kann, dann mach den Parameter doch zu einer Camera. Ich verstehe nicht wo das Problem liegt.
-
Dieser Thread wurde von Moderator/in CMatt aus dem Forum WinAPI in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ja KRV_ ist ein namespace. Allerings nicht im klassischen Sinn. Ich beginne einfach alle meine Klassen mit KRV_. KRV_Object enthält generelle informationen wie der Klassen und der Instanzname sowie der Instanzierungszeitpunkt.
Ich schreibe schnell ein wenig Pseudocode um das Problem zu verdeutlichen!
class KRV_Object{ }; class KRV_Light:public KRV_Object{ }; class KRV_ObjectManager{ public: void addObject(KRV_Object *pObj); }; class KRV_CameraManager{ private: KRV_ObjectManager mngr; public: void addCamera(KRV_Camera *pCam){ mngr.addObject(pCam); } };
usw...
Ich hoffe ihr seht die Problematik. Die Methode addCamera ist in diesem Falle nur dazu da, dass im Camera - manager nur Camera objekte drinn sind.
Ich habe in meiner Engine genau 5 Manager and der ObjectManager hat genau 29 Methoden. Also müsste ich 4 * 29 = 116 Methoden schreiben, die nichts anderes machen als die entsprechende Mehtode des ObjectManagers aufzurufen.
-
Warum kein template?
template <typename ManagedType> class Manager { public: addObject(ManagedType * p); };
Dann kannst Du mit Manager<Camera>, Manager<Object> etc. Deine Manager anlegen. Wobei mir der Sinn, Window und Camera von einer gemeinsamen Basis erben zu lassen, verborgen bleibt.
MfG Jester
-
Ishildur schrieb:
Ja KRV_ ist ein namespace. Allerings nicht im klassischen Sinn. Ich beginne einfach alle meine Klassen mit KRV_.
Dafür gibts namespaces. Also benutz sie auch. Da bricht man sich beim tippen ja sonst die Finger: KSGIUWE_Object *lol*
KRV_Object enthält generelle informationen wie der Klassen und der Instanzname sowie der Instanzierungszeitpunkt.
Wozu? Reicht dir die C++ RTTI nicht?
Ich habe in meiner Engine genau 5 Manager and der ObjectManager hat genau 29 Methoden. Also müsste ich 4 * 29 = 116 Methoden schreiben, die nichts anderes machen als die entsprechende Mehtode des ObjectManagers aufzurufen.
templates
btw: 29 Methoden für einen Manager? Was macht der denn alles?
-
KRV_Object enthält generelle informationen wie der Klassen und der Instanzname sowie der Instanzierungszeitpunkt.
Wozu? Reicht dir die C++ RTTI nicht?
Wow, seit wann kann C++ denn sowas? Den Instanzierungszeitpunkt per RTTI-Bestimmen? Also ich habe ja schon viele Tricks in C++ gesehen, auf die ich nie gekommen wäre, aber wie man das macht, musst du mir unbedingt erklären.
Allerdings ist mir nicht ganz klar, was Ishildur mit Instanznamen meint. Ishildur, vergibst er jeder Instanz noch einen Namen? Wieso? Du kannst sie auch eindeutig über die Addresse identifizieren.
Muss ich dann bei der Konstruktion jedem Objekt einen Namen übergeben? Wie sieht das beim Kopieren aus? Woher nimmt der Copy-C'tor oder der Zuweisungsoperator den Namen? Dürfen mehrere Instanzen den gleichen Namen tragen?
Ich seh da beim besten Willen keinen Sinn drin.
-
Ishildur schrieb:
Ich habe in meiner Engine genau 5 Manager and der ObjectManager hat genau 29 Methoden. Also müsste ich 4 * 29 = 116 Methoden schreiben, die nichts anderes machen als die entsprechende Mehtode des ObjectManagers aufzurufen.
uff 29methoden für einen manager sind wirklich viel^^
manager sollen methoden zum einfügen/löschen haben, dann methoden zum raussuchen der objekte,und dann wars das auch..
manager=aktenschrank