[gelöst] [Newbiefrage] Globale Variablen in mehreren .cpp nutzen?
-
Hi,
bisher habe ich das wenige was ich mir beibringen konnte alles in eine Datei geschrieben, aber nachdem ich nun die Marke von 600 Zeilen überschritten habe und es langsam lästig wird hoch und runter zu scrollen, auf der Suche nach etwas, wollte ich meinen Code ein wenig auslagern und habe mir mal angeguckt wie das mit den .cpp und .h funktioniert. Grundsätzlich Funktioniert das auch aber nun habe ich doch eine Frage, hier mal mein Problem:
main.cpp
#include <iostream> #include <SDL_opengl.h> #include "test.h" bool Quit = false; int main( int argc, char** argv) { while( Quit == false) { Test(); } return 0; }test.h
void Test();test.cpp
#include <iostream> #include <SDL_opengl.h> #include "test.h" void Test() { for( int i = 0; i < 10; i++) { SDL_Delay(100); } Quit = true; }Dabei bekomme ich jetzt halt die Fehlermeldung in der test.cpp das Quit nicht deklariert wurde. Wie mache ich das denn wenn ich diese Variable aber auch in den anderen Files benutzen möchte? Die Variable Quit soll halt generell in allen weiteren .cpp Files verfügbar sein. Hab's probiert die Variable vor dem Aufruf von test.h zu deklarieren aber das brachte keinen Erfolg.
Gruß Daniel
-
Globale Variablen wei du sie nutzen willst sind extrem schlechter Stil. Überleg dir lieber noch einmal ob du deinen Code wirklich so verhunzen willst.
Ansonsten:
In eine Header-Datei gehört die Deklaration der Variable:
extern type identifier;Überall wo du diese Variable nutzen willst musst du die Headerdatei einbinden.
In eine Source-Datei gehört die Definition der Variable:
type identifier = initvalue;
-
Danke schonmal für die schnelle Antwort. Von gutem und schlechtem Stil hab ich noch nicht die leiseste Ahnung... *gg* Aber ich hätte halt gerne das ein paar wenige Variablen überall in meinem Code zugreifbar sind. Also muss ich jetzt eine Header schreiben in der die Variablen die ich überall nutzen möchte drin stehen? Das ist ja einfach

Ok, dachte ich zumindest. Kannst du mir eventuell wenn's nicht zuviel Umstände macht das mal kurz für ganz dumme an meinem Beispielcode erläutern?

[EDIT]
Ok, hab's doch hinbekommen... Wer versteht was er liest ist klar im Vorteil...
Danke
-
Ok, ich noch mal schnell. Bis jetzt hat mir deine Antwort wirklich sehr weiter geholfen, allerdings bin ich jetzt an einem Punkt wo ich dann doch wieder stecken bleibe. Hier mal grad mein zusammengekürzter Code um den es geht:
main.cpp
void ReadLine( ifstream &file, string &line) { getline( file, line); } /* --- */ ifstream file; string line; file.open( "test.txt", ios::in); while( !file.eof()) { ReadLine( file, line); cout<<line<<endl; }Das funktioniert soweit, allerdings wenn ich die Funktion ReadLine in eine eigene .cpp stecken möchte, da ich es wohl häufiger auch an anderen Stellen brauchen werde einfach die nächste Zeile aus einer .txt zu holen, bekomme ich sehr sehr viele Fehlermeldungen meines Compilers. Jedenfalls mehr als ich hier auflisten könnte. Habe es so probiert:
main.cpp
ifstream file; string line; file.open( "test.txt", ios::in); while( !file.eof()) { ReadLine( file, line); cout<<line<<endl; }test.h
void ReadLine( ifstream &file, string &line);test.cpp
void ReadLine( ifstream &file, string &line) { getline( file, line); }Nehme an ReadLine.cpp kann die Variablen file und line nicht kennen? Aber wie übergebe ich ihm die richtig?
-
ReadLine kennt die Parameter, die du übergibst. Welcher Fehlermeldungen kriegst du denn? In der Regel sind nur die ersten paar Zeilen interessant.
-
error: variable or field 'ReadLine' declared void
error: 'ifstream' was not declared in this scope
error: 'file' was not declared in this scope
error: 'string' was not declared in this scope
error: 'line' was not declared in this scope
-
main.cpp
#include <iostream> #include "ReadLine.h" int main() { std::ifstream file("Test.txt"); std::string text; ReadLine(file, text); }ReadLine.h
#ifndef READLINE_H_INCLUDED #define READLINE_H_INCLUDED #include <fstream> void ReadLine(std::ifstream &file, std::string &line); #endif // READLINE_H_INCLUDEDReadLine.cpp
#include "ReadLine.h" void ReadLine(std::ifstream &file, std::string &line) { getline(file, line); }Edit:
Hab vergessen was zu fragen.
Worin liegt eig. der Sinn von ReadLine? Warum rufst du nicht gleich getline() auf? Das einzigste, was du hier machst, ist noch einen weiteren Funktionsaufruf dazwischen zu quetschen, der total unnötig ist.
-
Bindest du die nötigen Header für ifstream und string ein? Und denkst du an "using namespace std;"? (using namespace ist Stiltechnisch in Header-Dateien verboten, da die Header dadurch den Namespace der Source-Dateien verunreinigen).
-
Also mein ganzer Code den ich grad zum Testen nehme schaut so aus:
main.cpp
#include <iostream> #include <string> #include <fstream> using namespace std; int main() { ifstream file; string line; file.open( "test.txt", ios::in); while( !file.eof()) { ReadLine( file, line); cout<<line<<endl; } return 0; }test.h
void ReadLine( ifstream &file, string &line);test.cpp
#include <iostream> #include <string> #include <fstream> using namespace std; void ReadLine( ifstream &file, string &line) { do { getline( file, line); } while( !file.eof() && (line[0] == '/' || line[0] == '\n')); }Habe das ReadLine ausgelagert da ich es häufiger brauchen werde und ich nicht jedesmal die ganze Zeile schreiben wollte von wegen Kommentare und Leerzeilen überspringen. So ruf ich dann ReadLine auf und bekomme genau was ich will. Halt immer wenn ich es aufrufe. Zumindest ist das mein Gedanke dahinter.
-
insanity schrieb:
test.h
void ReadLine( ifstream &file, string &line);Hier benutzt du die Typen "ifstream" und "string", welche jedoch überhaupt nicht bekannt sind. Schau dir das Beispiel vom freakigen Freaky an.
-
Danke

Ich verneige mich vor euren Künsten!
Hier muss man auch auf alles achten...
Ich habe jetzt in die Header kein using namespace std geschrieben sondern std:: verwendet wegen deiner Aussage oben. Ist das generell falsch namespace zu verwenden oder nur schlecht weil er das dann auf die ganze Datei anwenden möchte die zum Header gehört? Weil in der Datei würde ich doch eh den selben Namespace nutzen wollen...