Variablen in mehreren Dateien zur verfügung stellen



  • Hallo, ich möchte die beiden Variablen

    Tool *m_pTools[ToolTypeMax];
    ToolType m_SelectedTool;

    in unterschiedlichen Klassen nutzen können. Wie löst man dies am sinnvollsten in C++?

    Mir fallen da drei Lösungen ein:

    1.)

    class HelperClass
    {
    	public:
    		static Tool *m_pTools[ToolTypeMax];
    		static ToolType m_SelectedTool;
    }
    

    2.)
    Ich lege eine neue Datei "Globals.h" an, in der ich alle globalen Variablen aufliste.

    3.)

    namespace Globals {
    Tool *m_pTools[ToolTypeMax];
    ToolType m_SelectedTool;
    }
    


  • Am saubersten klingt für mich 1.)
    Ggf könntest du das ganze noch als Singleton realisieren.



  • Normalerweise 1.) in Verbindung mit dem Singleton-Pattern.
    Aber die Klasse sollte schon einen klar definierten Zuständigkeitsbereich haben... bunt irgendwelche Variablen da hineinzupacken, bringt nichts. Da nimmst du dann doch lieber 2. und 3. (gehört zusammen, wenn schon).

    Edit: Beispiel für "klar definierten Zuständigkeitsbereich":
    m_pTools wird von einem "ToolManager" verwaltet.



  • Nur leider läuft das ganze nicht, ich bekomme lauter Fehler:
    error C2143: syntax error : missing ';' before '*'
    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

    selbst wenn ich die globale Variante wähle.



  • Sind die Typen Tool und ToolType auch bekannt an der Stelle?



  • Müssten sie. Das enum ToolType ist in der "Definitions.h":

    #ifndef DEFINITIONS_H
    #define DEFINITIONS_H
    
    enum ToolType
    {
        ToolTypeNone,
        ToolTypeLine,
        ToolTypeMax
    };
    
    #endif
    

    und die HelperClass in der "HelperClass.h":

    #ifndef HELPERCLASS_H
    #define HELPERCLASS_H
    
    #include "Definitions.h"
    #include "Tool.h"
    
    class HelperClass
    {
    	public:
    		Tool *m_pTools[ToolTypeMax];
    		ToolType m_SelectedTool;
    };
    
    #endif
    

    Die ToolClass sieht folgendermaßen aus:

    #ifndef TOOL_H
    #define TOOL_H
    
    #include <Windows.h>
    #include "Definitions.h"
    #include "HelperClass.h"
    
    class Tool
    {
    	public:
    		Tool();
    ...
    };
    
    #endif
    

    In der "Window.h" werden dann nochmal

    #include "Definitions.h"
    #include "HelperClass.h"
    #include "Tool.h"

    eingebunden.

    Im Kostructor der Window.cpp initialisiere ich die Variablen folgendermaßen:

    HelperClass::m_pTools[(int)ToolTypeLine] = new ToolLine();
    HelperClass::m_pTools[(int)ToolTypeRectangle] = new ToolRectangle();
    HelperClass::m_SelectedTool = ToolTypeLine;
    


  • Ja, musst schon "Window.h" einbinden und nicht <Windows.h> (das ist nämlich der Windows-Header).



  • Nene, das stimmt schon, die Tool Klasse braucht nicht auf die Window.h zu verweisen. Kann es sein, dass das Problem darin liegt, dass die Tool.h die HelperClass.h einbindet und umgekehrt, also eine Art Ringabhängigkeit entsteht? Solange ich die HelperClass nicht in der Tool.h einbinde geht es nämlich.



  • Ja, du musst in einem der beiden Header die jeweils andere benötigte Klasse vorher bekanntmachen (mit class xyz;).



  • Also mit

    namespace HelperClass{
    static Tool *m_pTools[ToolTypeMax];
    static ToolType m_SelectedTool;
    };
    

    geht es jetzt. Ich hatte hier nur das static vergessen. Ohne bekomme ich unter anderem diesen Fehler:
    error LNK1169: one or more multiply defined symbols found

    Verwende ich

    class HelperClass
    {
    	public:
    		static Tool *m_pTools[ToolTypeMax];
    		static ToolType m_SelectedTool;
    };
    

    kommt dieser Fehler:
    Error 6 error LNK1120: 2 unresolved externals


Anmelden zum Antworten