Probleme mit Aufruf von static Methode ausserhalb von Klassen



  • Hi,

    hier kommt etwas Code, bei dem ich beim compilieren (mit VC8) Fehler bekomme:

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // Loader.h
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    #include "Xyz.h"
    
    // Abstract loader interface
    class Loader
    {
    public:
        virtual Xyz Load(const std::string& filePath) = 0;
    };
    
    // Singleton class
    class LoaderMap
    {
    public:
        static LoaderMap* Instance();
    
        void RegisterLoader(Loader* loader, const std::string& id);
    
        Loader* GetLoader(const std::string& id);
    
    private:
    
        LoaderMap();    // Hidden standard constructor
    
        std::map<std::string, Loader*> m_map;
    
        static LoaderMap* _instance;
    };
    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // Loader.cpp
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    LoaderMap* LoaderMap::_instance = NULL;
    
    LoaderMap* LoaderMap::Instance()
    {
        if(_instance == NULL)
        {
            _instance = new LoaderMap();
        }
        return _instance;
    }
    
    void LoaderMap::RegisterLoader(Loader* loader, const std::string& id)
    {
        m_map[id] = loader;
    }
    
    Loader* LoaderMap::GetLoader(const std::string& id)
    {
        return m_map[id];
    }
    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // ConcreteLoader.h
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    #include "Loader.h"
    
    class ConcreteLoader : public Loader
    {
    public:
        virtual Xyz Load(const std::string& filePath); 
    };
    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // ConcreteLoader.cpp
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    LoaderMap::Instance()->RegisterLoader(new ConcreteLoader(), "CONCRETE_LOADER");
    
    void Xyz ConcreteLoader::Load(const std::string& fileath)
    {
        // ...
    }
    

    Ich hoffe, ich habe keine Fehler gemacht (habe meinen eigentlich Code vereinfacht und blind neu getippt).

    Die Zeile

    LoaderMap::Instance()->RegisterLoader(new ConcreteLoader(), "CONCRETE_LOADER");
    

    will jedenfalls nicht kompilieren. Ich bekomme die Fehler

    error C2143: syntax error : missing ';' before '->'
    error C2761: 'LoaderMap *LoaderMap::Instance(void)' : member function redeclaration not allowed

    Offensichtlich denkt der Compiler, dass ich die Instance() Methode nochmal deklarieren will. Will ich aber gar nicht 😞

    Ich habe weder Ahnung, warum ich diese Fehler bekomme, noch (was viel schlimmer ist), was ich anders machen kann. Und daher wäre ich sehr sehr dankbar, wenn jemand einen Tipp hätte.

    Danke,
    Felix



  • LoaderMap::Instance()->RegisterLoader(new ConcreteLoader(), "CONCRETE_LOADER"); ist eine Anweisung und diese Muss in einer Methode oder Funktions stehen. Du kannst eine Anweisung nicht einfach so mitten in den Quellcode packen, weil der Compiler dann nicht wissen kann, wann die Anweisung ausgeführt werden soll...



  • Ok, aber wie macht man sowas dann am besten?



  • FelixManke schrieb:

    Ok, aber wie macht man sowas dann am besten?

    Das kommt drauf an, wann das ausgeführt werden soll.


Anmelden zum Antworten