Ressourcenzuweisung zur Compilezeit



  • Hallo Allerseits,

    ich habe folgendes Problem:

    Mehrere Klassen teilen sich Ressourcen, welche nur von einer Klasse benutzt werden können. Daher darf nur eine der Klassen instantiiert werden. Das zur Laufzeit zu erreichen ist recht einfach.
    Beispiel (nur, um das Prinzip zu zeigen...):

    #include <assert.h>
    
    class Ressource
    {
    public:
        enum res
        {
            RES1,
            RES2
        };
    private:
        bool ressources[RES2];
        Ressource() {};
    public:
        static Ressource &Inst(void)
        {
            static Ressource theRessource;
            return theRessource;
        };
        bool isAlloc(res r) { return ressources[r]; };
        void allocate(res r) { ressources[r] = true; };
    };
    template<Ressource::res r>
    class a
    {
    public:
        a() { assert (!Ressource::Inst().isAlloc(r)); Ressource::Inst().allocate(r); };
    };
    template<Ressource::res r>
    class b
    {
    public:
        b() { assert (!Ressource::Inst().isAlloc(r)); Ressource::Inst().allocate(r); };
    };
    int main() {
        a<Ressource::RES1> mya;
        b<Ressource::RES1> myb;
    	return 0;
    }
    

    führt zur Laufzeitmeldung:
    test.cpp:33: b<r>::b() [with ressource r = (ressource)0u]: Assertion `!ressourcen[r]' failed.

    Dies würde ich gerne zur Compilezeit sicher stellen, also eine Fehlermeldung des Compilers erreichen.

    Leider finde ich keine Lösung, weiß auch nicht, ob das überhaupt möglich ist.

    Für jeden Hinweis bin ich dankbar.

    Gruß

    Stephan



  • StephanH schrieb:

    Dies würde ich gerne zur Compilezeit sicher stellen, also eine Fehlermeldung des Compilers erreichen.

    Leider finde ich keine Lösung, weiß auch nicht, ob das überhaupt möglich ist.

    Nein ist nicht möglich. Stell dir folgendes vor:

    a<Ressource::RES1> mya;
    if(rand()%2)
      b<Ressource::RES1> myb;
    

    uU ist das monostate design pattern aber eine aktzeptable lösung?



  • Shade Of Mine schrieb:

    Stell dir folgendes vor:

    Peinlich, darauf hätte ich auch selber kommen können 😮

    Danke

    Stephan


Anmelden zum Antworten