virtual static



  • Hallo...

    Ich habe mal wieder ein problem:

    Ich habe eine Klasse, die vom Nutzer noch einmal abgeleitet werden soll, der dann eine Funktion angeben (eigtl überschreiben) soll, die threaded gestartet werden soll. Ist ja auch egal warum genau, aber sie muss halt static sein.

    (also nicht, dass jz alle wieder anfangen von wegen: threads sind kein C++-Standard - spielt hier eigtl keine Rolle denk ich ^^)

    virtual static
    

    geht nicht (virtual kann nicht mit static verwendet werden)

    Ich könnte natürlich auch jedes mal im ctor nen Funktions-pntr mitübergeben, aber dachte mir, dass es vll eine sinnvollere Lösung gibt, als für jede Instanz der Klasse wieder das Gleiche zu speichern (zu mal es für so was ja static gibt ^^)...

    Ich hoffe, dass das gut genau beschrieben ist - falls nicht hier einfach mal in Code-kurz-Form ^^:

    class base_1
        {
            private:
                virtual static unsigned fkt (void *parameter) = 0;
            public:
                void bar (void)
                    {
                        //thread erstellen
                    }
    
        }; //geht halt nicht
    
    class base_2
        {
            private:
                (unsigned *) fkt (void *);
            public:
                void bar (void)
                    {
                        //thread erstellen
                    }
    
        }; //ist (in meinen Augen) bissl unsinnig
    

    Danke schon mal 🙂



  • unskilled schrieb:

    Ich habe eine Klasse, die vom Nutzer noch einmal abgeleitet werden soll, der dann eine Funktion angeben (eigtl überschreiben) soll, die threaded gestartet werden soll. Ist ja auch egal warum genau, aber sie muss halt static sein.

    Ich würde mal darauf tippen das dies (static) eine Einschränkung deiner Threadingbibliothek ist. Vielleicht machst du einfach etwas in der folgenden Art:

    class Base
    {
      public:
        static void foo(Base* obj)
        {
          if(obj)
            obj->threadMethode();
        }
      protected:
        virtual void threadMethode() = 0;
    };
    

    Ansonsten bleiben dir tatsächlich nur Funktionszeiger.

    Alternativ schau dir die Threadingbibliothek von Boost an, dazu boost::bind und boost::function.

    cu André



  • danke

    noch mal dazu:

    asc schrieb:

    Ich würde mal darauf tippen das dies (static) eine Einschränkung deiner Threadingbibliothek ist.

    Naja - ich find das rel. logisch (nutze die windows-api (_beginthreadex (...) oder so ^^) und die will nun mal ne fkt, die nur ein parameter erwartet: void*). Von daher muss es ja ne static Funktion sein - oder?

    asc schrieb:

    Alternativ schau dir die Threadingbibliothek von Boost an, dazu boost::bind und boost::function.

    Bin nich so ein boost-Fan - und wenn mans so einfach selbst schreiben kann seh ich au keinen Grund, andere Bibliotheken zu verwenden...

    Aber danke - dann werd ich es wahrscheinlich doch mit Funktions-Pointern machen - wahrscheinlich is das so gar besser als wenn virtual static gehen würde - in meinem Fall zumindest ^^

    Tom



  • Mach es halt wie alle anderen: gibt nen Zeiger auf die Basisklasse als void* Parameter mit, casten den in der Funktion zurück, und ruf darüber die normale virtuelle Funktion auf.

    http://www.google.com/search?hl=en&safe=off&q="trampoline+function"+CreateThread


Anmelden zum Antworten