Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 10.06.2007, 14:57 Titel: Globale Deklarationen |
|
|
Ich hab mich mal so durch den Code der DirecX-Samples durchgewühlt und dabei ist mir aufgefallen wie sinnvoll es wäre globale Instancen, Variablen oder Devices zu haben, auf die alle Klassen zugreifen können. Als ich das dann versucht habe, war meine Euphorie jedoch schnell wieder verflogen.
Zuerst habe ich es folgendermaßen probiert:
MainSource.cpp: Code: | int subberglobalesInt;
#include "SubSource.h" | SubSource.cpp: Code: | #include "SubSource.h"
subberglobalesInt = 3; |
Dann hat mir der Compiler weißmachen wollen, dass es in SubSource.cpp keine Variable namens subberglobalesInt gäbe.
Ich hab immer gadacht der Präprozessor würde bei jedem #include das entsprechende File einfügen und den Code folgendermaßen zusammensetzen: Code: | int subberglobalesInt;
subberglobalesInt = 3; | War dann aber net so.
Dann hab ich mir gedacht ich deklariere meine subberglobale Variable in einen extra Header, die ich dann bei jeder Source-Datei einfüge:
Header: Code: | #ifndef GLOBALSFILE
#define GLOBALSFILE
int subberglobalesInt;
#endif GLOBALSFILE | Da war dann der Compiler zwar zufrieden, doch dem Linker hat das überhaupt nicht gefallen. Der meinte nämlich, ich würde subberglobalesInt zu oft deklarieren. Hmm !
Nun bin ich mit meinem Latein am Ende und meine Euphorie der globalen
Deklarationen schwindet mehr und mehr. Gibt es da vielleicht jemande der mir mit Tipps und Tricks wieder Mut machen kann ? |
|
Nach oben |
|
|
Christian Rousselle Site Admin
Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 10.06.2007, 15:28 Titel: |
|
|
Das ist auch alles richtig, was der Compiler und der Linker sagen Woher soll SubSource.cpp auch int subberglobalesInt; kennen, wenn du es in MainSource.cpp deklarierst?
Was du machen kannst ist:
int subberglobalesInt;
in MainSource.cpp zu deklarieren und dann in SubSource.cpp
extern int subberglobalesInt;
Das ist aber nicht so schön. Am besten du schreibst dir eine Singleton-Klasse, in der du die "globalen" Variablen unterbringst
C. |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 10.06.2007, 15:33 Titel: |
|
|
Danke für die schnelle Antwort bloß was ist ne "Singleton-Klasse" ?
Ist das was anderes wie meine globals.h ? |
|
Nach oben |
|
|
manu Super JLI'ler
Alter: 35 Anmeldedatum: 09.03.2006 Beiträge: 327 Wohnort: allgäu (DE) Medaillen: Keine
|
Verfasst am: 10.06.2007, 15:55 Titel: |
|
|
Otscho hat Folgendes geschrieben: | Danke für die schnelle Antwort bloß was ist ne "Singleton-Klasse" ?
Ist das was anderes wie meine globals.h ? |
guck dazu einfach mal ins Tutorials unterforum hier
ist halt ne klasse mit nur einer instanz die du von "überall" erreichst^^
edit:
konkret:
http://www.jliforum.de/board/viewtopic.php?t=4157 |
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 11.06.2007, 08:01 Titel: |
|
|
Ich würde vorsichtig sein bei der Verwendung von Singleton Klassen, genauso wie bei globalen Variablen.
Sowas macht meiner Meinung nach den Code unübersichtlicher und ist meist eigentlich auch nicht notwendig.
OOP besteht aus Klassen und Klassenbeziehungen. Wenn ich einer Klasse im Konstruktor einen Zeiger z.B. auf eine Klasse namens GraphicsDevice gebe, dann ist klar dass die Klasse Zugriff auf darauf hat, und braucht. Wenn man globale Klassen verwendet hat man diese Übersicht nicht mehr und man verliert den Überblick welche Kklasse welche Abhängigkeiten besitzen.
Natürlich gibt es Probleme bei deren Lösung Singletons sehr hilfreich sein können, aber ich würde vorsichtig bei der verwendung sein, sonst hat man irgendwann einen Haufen von Singletons rumfliegen und weiß nicht mehr wie die zueinander stehen. |
|
Nach oben |
|
|
Maxim Senior JLI'ler
Anmeldedatum: 28.03.2004 Beiträge: 249
Medaillen: Keine
|
Verfasst am: 11.06.2007, 08:32 Titel: |
|
|
naja, singletons kann man ohne große sorgen verwenden wenn die klasse in keiner beziehungen zu einer ander steht oder wenn die klasse ein art verwaltungsklasse ist z.B. RessourcenManager oder ähnliches.
ich verwende singletons immer dann, wenn ich genau weiß, dass nur eine instanz der klasse benötigt wird und damit man die übersicht nicht verliert sollte man sowieso klassenbeziehungen als ein diagramm haben.
PS:
ich bin ein großer fan von OOP, aber ich muss sagen, dass OOP (ich spreche nur für c++) nicht immer optimale lösung bietet... |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 11.06.2007, 15:51 Titel: |
|
|
Ich finde es wichtig, viele Techniken zu kennen, und zu wissen, wann man sie einsetzen sollte. Wenn mein Infolehrer meint, eine einzelne Stringfunktion, die ich mal gerade geschrieben habe, müsste in eine extra klasse, finde ich das einfach nur noch dämlich (zumal ja globale Variablen "verboten" sind, und ich so in jeder Funktion die die Klasse dann braucht Konstruktor und Destruktor per Hand aufrufen muss, Delphi eben).
Ich verwende auch nicht nur Singletons, aber schon überall dort, wo es gerade passt. Denn Zeiger auf Grafik- und Soundklassen von Objekt zu Objekt weiter zu reichen und zu speichern, st auch unübersichtlich. Und ich weiß ja, dass das Level sich anzeigt und Geräusche macht, ebenso wie die Spielfiguren darin. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
|