funktionspointer problem



  • Problem:

    class foo
    {
        public:
        long func ();
    };
    
    int main ()
    {
        long (*PointerToFunc) ();
        foo bar;
    
        PointerToFunc = bar.func; // oops, das funzt nicht
    }
    

    Lösung 1:

    class foo
    {
        public:
        long func ();
    };
    
    foo bar;
    
    long tempfunc ()
    { return bar.func (); }
    
    int main ()
    {
        long (*PointerToFunc) ();
    
        PointerToFunc = tempfunc; 
    }
    

    Wie mal leicht sehen kann, bin ich damit nicht glücklich. bar muss Global sein, und es wird eine zusätzliche Funktion benötigt. casten hab ich versucht, hat nicht geklappt. Hat jemand ne elegante Methode?



  • Die Dinger für Methoden heißen dann logischerweise Methodenpointer.

    Gruß



  • Hallo

    siehe Suche. Da hab ich zum Beispiel das gefunden.

    bis bald
    akari



  • #include <iostream>
    class foo
    {
        public:
        long func ()
        { 
             std::cout << "Called Method: long foo::func() and return value = "; 
             return 10; 
        }
    };
    
    int main ()
    {
        // Zeiger auf Methode func() von foo
        long (foo::*PointerToFunc) (); 
        foo bar;
        // Methodenzeiger zuweisen
        PointerToFunc = &foo::func; 
        // Methodenzeiger aufrufen
        std::cout << (bar.*PointerToFunc)() << std::endl;   
    }
    

    Edit: Btw Hurra die 1000 sind voll *g*



  • oh, ich hab vergessen zu erwähnen, dass der Funktionspointer nicht verändert werden darf. Denn er kommt aus eine dll, die ich nicht selbst geschrieben habe. Sonst wär meine Frage wirklich n bisser dümmlich, geb ich zu.



  • Dann brauchst Du aber eine Möglichkeit das dazugehörige Objekt zu identifizieren. Dein Callback gibt anscheinend keine Möglichkeit dazu.

    Üblicherweise sind solche Callback-APIs so gehalten, dass man einen Wert beim Registrieren mitgibt, der bei jedem Aufruf des Callbacks wieder zurückgegeben wird.

    In deinem Fall hilft Dir vielleicht ein Singleton weiter.



  • *schäm* ich muss feststellen, dass ich heute die selbe Frage neu gestellt hab...
    Aber irgendwie ist die Suchfunktion auch nicht so ideal 😉

    Also, hier meine Lösung:

    class Test {
    public:
    	void foo () {
    		return;
    	}
    };
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow )
    {
    
    	Test t;
    	void (Test::*pTestFkt)();
    	pTestFkt = &Test::foo;
    	(t.*pTestFkt)();
    
    	return 0;
    }
    

    Das klappt bei mir.

    Viele Grüße,

    Matthias



  • fehlersucher schrieb:

    *schäm* ich muss feststellen, dass ich heute die selbe Frage neu gestellt hab...
    Aber irgendwie ist die Suchfunktion auch nicht so ideal 😉

    Also, hier meine Lösung:

    class Test {
    public:
    	void foo () {
    		return;
    	}
    };
    
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow )
    {
    
    	Test t;
    	void (Test::*pTestFkt)();
    	pTestFkt = &Test::foo;
    	(t.*pTestFkt)();
    
    	return 0;
    }
    

    Das klappt bei mir.

    Viele Grüße,

    Matthias

    klar, bei mir auch!
    Leider kann ich aber keinen solchen Pointer verwenden, da ich den vorgefertigten verwenden muss.


Log in to reply