Auf gemeinsame Variable in verschiedenen CPP-Dateien zugreifen
-
Hallo zusammen
Ich bin eher ein Anfänger in sachen C++, die grösse meiner Programme bewegt sich daher auch immer im Rahmen eines einzelnen CPP Files.
In einem grösseren Projekt verliere ich langsam die Übersicht und würde gerne diverse Funktionen in einem separaten File unterbringen.
Die Funktionsdeklarationen mache ich in einem Headerfile, das ich ins Haupt-CPP und das Funktions-CPP File include.
Nun sollte ich aber aus beiden CPP Files auf diesselben Variablen zugreifen... Wenn ich diese aber in meinem Headerfile definiere, meckert nacher der Linker dass die Referenz schonmal vorhanden ist.
Was ist der schlauste Weg um Variablen "noch globaler als global" zur Verfügung zu stellen? (Sollte natürlich ISO-C++ sein, muss unter Win32 und Linux compilieren)
Danke!
-
Du schreibst Dir ne Klasse
class my_own { private: int my_var; public void foo(void); int foo(int); };
Diese Funktionen kannst du dann aufrufen und die können auf die Variable zugreifen.
void myown::foo(void) { my_var=7; } ...
Es ist dann ganz egal, auf wieviele Dateien Du die Funktionen verteielst.
-
Danke!
Wäre leider ein wenig umständlich, da ich unter anderem auch aus der main-Funktion auf diese Variablen zugreifen muss und dies einiges an "unnötiger" Umstellung im Code verursachen würde.
(Eine grössere Umstrukturierung muss ich zwar sowieso vornehmen, aber erst wenn das Design etwas klarer ist)
Ich habe nun einen wohl eher unschönen Umweg gefunden:
#include "functions.cpp"
Gibt es denn noch andere Wege?
-
Du kannst auch in der main auf diese Variable zugreifen.
Hier ein etwas anders Bsp:class my_own { privat: ... public: int my_var; //Variable jetzt public, also auch von außen sichtbar };
Dann kannst Du im Programm so rankommen.
int main(void) { my_own my_handle; //Objekt der Klasse erzeugen handle.my_var=5; // die Variable ist jetzt 5 :-) int c=handle.my_var; //c=5; }
-
Stehe ich denn so nicht wieder vor dem gleichen Problem, dass die Variablen des Objektes my_handle mit deren Werten nur in der main-Funktion zur Verfügung stehen und ich jedoch aus einer Funktion in einem anderen File nicht darauf zugreifen kann?
Danke für die Hilfe
-
Ok, war ein Mißverständniss.
Definiere die Variable einfach im Header ind include den überall, wo Du die Variable brauchst, so sollte es den gewünschten Effekt haben.
Es genauso, als wenn Du die .cpp einbindest, nur halt schöner.
-
Dies war eigentlich auch meine erste Idee... und der Grund für das erste Posting. Wenn ich eine Variable im Headerfile definiere:
//functions.h [...] string einstring; [...]
Und diese dann in beidnen CPP Files include:
//main.cpp #include "functions.h" [...]
//functions.cpp #include "functions.h" [...]
Bekomme ich anschliessend Errors vom Linker (Visual Studio 2003), dass die "Symbole mehrfach definiert seien".
Hab irgendwas im Kopf dass man solche Probleme dann mit "extern" usw lösen könne, nur leider hab ich keine Informationen auf einem für mich verständlichen Niveau gefunden
-
Kann es eein, daß Du die Variable nochmal irgendwo definiert hast?
Schau da nochmal nach.
-
Hi,
wie du sagst, dazu nimmt man extern:
//---myheader.h--- extern int myVar; //Deklaration (so oft wie du willst) //---1.cpp--- #include "myheader.h" int myVar; //Definition (!nur einmal!) //---2.cpp--- #include "myheader.h" //hier ist myVar jetzt auch bekannt
-
Boah. Nein. Niemals Variablen im Header definieren. Sonst kann es leicht passieren, dass du wie hier die One-Definition-Rule verletzt. Die Variable gehört in eine C++-Datei, in den Header kommt eine extern-Deklaration:
// foo.cpp string blah; // foo.h extern string blah; // blub.cpp #include "foo.h" ... blah = "hallo";
Vorsicht: Die Initialisierungsreihenfolge globaler Objekte ist zwischen Übersetzungseinheiten nicht festgelegt, du solltest also ohne weiteres keine globalen Variablen haben, die in ihrer Initialisierung Zugriff auf diesen String brauchen.
-
Danke vielmals!
So funktionierts bestens
Die Handhabung von verschiedenen Source / Header Files wär vielleicht auch was für die FAQ... Da ist sicher schon so mancher Anfäger drüber gestolpert.
-
Flavio Tischhauser schrieb:
Die Handhabung von verschiedenen Source / Header Files wär vielleicht auch was für die FAQ... Da ist sicher schon so mancher Anfäger drüber gestolpert.
Da könntest Du Recht haben...
http://www.c-plusplus.net/forum/viewtopic.php?t=39477
-
oops!
Ich habe mich wohl beim Überfliegen der FAQ zu fest auf das Stichwort Variablen, Extern etc. konzentriert... Tut mir leid, bin ansonsten auch ein RTFM-Befürworter