globale strukturen bilden



  • hallo leute,

    ich habe folgendes problem:

    ich möchte eine gobale struktur in einem header definieren, um sie im gesammten programm verwenden zu können.

    mein code sieht so aus:

    global.h

    #ifndef GLOBAL_H_INCLUDED
    #define GLOBAL_H_INCLUDED
    
    struct global {
        bool myLoop;
    };
    
    extern global commonGlobals;
    
    commonGlobals.myLoop = true;
    
    #endif
    

    main.cpp

    while(commonGlobals.myLoop) {
        //tu was
    }
    

    wenn ich das ganze kompilieren will, meldet der compiler (gcc):
    error: expected constructor, destructor, or type conversion before '.' token in zeile 11 (genau da wo ich der struktur den wert zuweisen will).

    ich versteh nicht was ich falsch mach, da ich es in diversen beispielen genau so gesehen habe.

    noch etwas: wenn ich die ganze struktur mit initialisierung und so in main.cpp packe und von einer anderen datei (z.b. test.cpp) zugreifen möchte, meldtet der compiler folgendes:
    C++\Dark Way\events.cpp|8|error: `commonGlobals' was not declared in this scope|

    meine idee war erst, die struktur in eine *.cpp datei umzulagern (ist aber eher unübglich, oder?) und diese dann in jeder datei, in der sie gebraucht wird zu includen. gibt es keine bessere lösung?

    danke im voraus



  • erloeser schrieb:

    commonGlobals.myLoop = true;
    

    [...]
    wenn ich das ganze kompilieren will, meldet der compiler (gcc):
    error: expected constructor, destructor, or type conversion before '.' token in zeile 11 (genau da wo ich der struktur den wert zuweisen will).

    Eine Zuweisung ist eine Anweisung, und Anweisungen dürfen nur in Funktionen stehen. Du willst eine Initialisierung:

    global commonGlobals = { true };
    

    Da das eine Definition darstellt, hat das im Header nichts zu suchen und gehört in eine cpp-Datei global.cpp.

    ich versteh nicht was ich falsch mach, da ich es in diversen beispielen genau so gesehen habe.

    Unwahrscheinlich.

    noch etwas: wenn ich die ganze struktur mit initialisierung und so in main.cpp packe und von einer anderen datei (z.b. test.cpp) zugreifen möchte, meldtet der compiler folgendes:
    C++\Dark Way\events.cpp|8|error: `commonGlobals' was not declared in this scope|

    Dann hast du wohl den Header nicht eingebunden. Da steht ja die extern-Deklaration von commonGlobals drin, also müsste er sie ja sonst sehen ...

    meine idee war erst, die struktur in eine *.cpp datei umzulagern (ist aber eher unübglich, oder?) und diese dann in jeder datei, in der sie gebraucht wird zu includen.

    Es ist unüblich, Implementationsdateien irgendwo einzubinden. (Ausnahmen macht man vielleicht bei Templates, nennt die dann aber auch nicht .cpp.)



  • also, ich habe jetzt die definition in die global.cpp gepackt.
    in global.cpp ist außerdem eine funktion, um die globalen variablen zu initialisieren.
    im header steht nurnoch der funktionsprototype und die struktur.

    ich möchte diese (globale) variable z.b. in events.cpp benutzen:
    also include ich den header (global.h).

    leider funktioniert das so nicht, da der compiler meckert (`commonGlobals' was not declared in this scope) ...

    so sieht mein code jetzt aus:

    global.cpp

    #include "global.h"
    
    extern global commonGlobals;
    
    void initGlobals() {
        commonGlobals.myLoop = true;
    }
    

    global.h

    #ifndef GLOBAL_H_INCLUDED
    #define GLOBAL_H_INCLUDED
    
    void initGlobals();
    
    struct global {
        bool myLoop;
    };
    
    #endif
    

    events.cpp

    #include <SDL.h>
    #include "global.h"
    #include "events.h"
    
    void handleEvent(SDL_Event keyEvent) {
        initGlobals(); //steht eigendlich in der main.cpp und ist nur aus platzgründen hier
    	switch (keyEvent.type) {
    		case SDL_QUIT:
    			commonGlobals.myLoop = false;
    			break;
    
    		case SDL_KEYDOWN:
    			switch (keyEvent.key.keysym.sym) {
    				case SDLK_ESCAPE:
                        commonGlobals.myLoop = false;
    					break;
    
                    default:
                        break;
    			}
    			break;
    	}
    }
    

    events.h

    #ifndef EVENTS_H_INCLUDED
    #define EVENTS_H_INCLUDED
    
    void handleEvent(SDL_Event);
    
    #endif
    


  • Die Deklaration von commonGlobals ( extern global commonGlobals; ) gehört in den Header. Die Definition ( global commonGlobals; ) seh ich bei dir nirgends, die gehört in die cpp. Wenn du eine Initialisierungsfunktion hast brauchst du keine explizite Initialisierung der Struktur, wie ich oben vorgeschlagen habe.



  • danke, es klappt!

    nochmal zur verständnis:
    man unterscheidet zwischen deklaration und definition (und initialisierung).

    deklaration kommt in die header
    definition in die hauptdatei (*.c / *.pp)

    eine deklaration ist die bekanntmachung eienr variable o.ä
    eine definition ist quasi die angelegte definition
    initialisierung ist eine wertzuweisung

    ich glaube ich habs verstanden.

    danke nochmal


Anmelden zum Antworten