[OOP] Init Sequenz in Ctor oder nich?
-
Moin Leudde
Frage zum Design.
Eine Klasse soll SDL Funktionen kapseln, die ich so brauch (nicht komplett).
Nun Frage zur Initsequenz der einzelnen Teil. Soll die komplett in den Ctor oder lieber in eine eigene Init() Funktion?sdlApp::sdlApp() { cout << "Initializing SDL" << endl; if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { cout << SDL_GetError() << endl; SDL_Quit(); //BTW: Wie kann ich hier die Konstruktion abbrechen? } if ( SDL_Init( SDL_INIT_TIMER ) < 0 ) { cout << SDL_GetError() << endl; SDL_Quit(); } if ( SDL_Init( SDL_INIT_AUDIO ) < 0 ) { cout << SDL_GetError() << endl; SDL_Quit(); } //...etc... }Und zweiten, wie kann ich der Funktion angeben, dass sie nur gewisse Teile initialisiert? Für jeden Teil (Video, Audio..) eine Bool Variable übergeben ist doch auch nicht hübsch oder?
Vieln Dank schonma
Bis dennsn
-
Init-Funktionen sind böse. Nicht ganz so böse wie goto oder globale Variablen, aber böse. Ein Konstruktur ist genau dafür da ein Objekt zu initialisieren. Und wenn der abgearbeitet ist, muß das Objekt fertig initialisiert sein. Das nur mal allgemein zum OOP-Aspekt.
Was ist so schlecht daran dem Konstruktor eine Reihe von bools zu übergeben? Kannst ja Default-Werte dafür vergeben. Eventuell wäre auch eine on-demand Initialisierung von SDL-Funktionalitäten möglich, die du nicht immer brauchst (d.h. jede relevante Funktion prüft, ob besagte SDL-Funktionalität bereits initialisiert wurde und holt das ggf. nach). Kann ich aber nicht beurteilen, ob das in diesem Fall geht/sinnvoll ist, weil ich mich mit SDL nicht auskenne.
Was das hier betrifft:
//BTW: Wie kann ich hier die Konstruktion abbrechen?
so mußt du an dieser Stelle eine Exception werfen.
-
Danke

-
Du kannst anstelle von vielen Bools auch Flags übergeben, also einen Integer wo du mit einzelnen Bits (das sind dann die Flags) markierst was gemacht werden soll oder nicht. Also z.B. 1 für Video ja/nein, 2 für Audio ja/nein, 4 für Timer ja/nein, 8 für was auch immer etc.
Du solltest aber den ganzen SDL Init Code ggf. in eine eigene Klasse schmeissen die im Constructor bloss das init macht und im Destruktor das Quit. Und sonst nix. Die kannst du dann "SdlInitScope" oder so nennen, und einfach als Member Variable in der Applikation drin haben.
-
hustbaer schrieb:
Du kannst anstelle von vielen Bools auch Flags übergeben, also einen Integer wo du mit einzelnen Bits (das sind dann die Flags) markierst was gemacht werden soll oder nicht. Also z.B. 1 für Video ja/nein, 2 für Audio ja/nein, 4 für Timer ja/nein, 8 für was auch immer etc.
Ah ja gute Idee

hustbaer schrieb:
Du solltest aber den ganzen SDL Init Code ggf. in eine eigene Klasse schmeissen die im Constructor bloss das init macht und im Destruktor das Quit. Und sonst nix. Die kannst du dann "SdlInitScope" oder so nennen, und einfach als Member Variable in der Applikation drin haben.
Kannst Du mir das erklären wieso? Also eigentlich ist das nich die Hauptapplikation, sondern nur für die Views (MVC-Model)..häng noch ein bisschen fest beim Design.
Dachte eigentlich, dass ich der sdlApp als Member andere Klassen übergebe für Rechtecke malen, Text ausgeben, Bilder blitten etc..
-
Hmm, wegen der Flags:
Ich hab inzwischen ein Singelton drauss gemacht, da kann ich dem Ctor ja gar keine Parameter übergeben..Wie sollt ichs lösen, über nen static Member?
-
singleton wird nur einmal initialisiert, wenn er also parameter braucht, werden sie beim ersten aufruf festgelegt. kannst es z.b. als paramater für die methode verwenden, die die instanz zurückgibt. spätere aufrufer haben halt pech gehabt, es sei denn, es gibt mehr als eine instanz (jeweils eine mit den entsprechenden parametern)
-
Kannst Du mir das erklären wieso? Also eigentlich ist das nich die Hauptapplikation, sondern nur für die Views (MVC-Model)..häng noch ein bisschen fest beim Design.
Dachte eigentlich, dass ich der sdlApp als Member andere Klassen übergebe für Rechtecke malen, Text ausgeben, Bilder blitten etc..
Ok, dann habe ich das "app" im Klassennamen falsch interpretiert (ich dachte "app" wie in Application - und das ist für mich "das Programm" - also ganz ganz aussen).
Wenn du im restlichen Programm nirgends direkt SDL Funktionen verwendest, sondern immer nur über diese "sdlApp" Klasse, dann ist das sogar das bessere Design. Ist halt auch mehr Arbeit, da du Wrapper für alle SDL Funktionen schreiben musst die du verwendest, aber wie gesagt für mich das bessere Design. In dem Fall sorry für die Verwirrung, und bau das einfach wieder zurück
(Die Singleton Lösung ist IMHO nicht optimal.)Ich würde das "sdlApp" Teil dann aber "SdlLibrary" oder "SdlWrapper" oder so nennen.