Funktionszeiger



  • Hallo,

    ich möchte eine Funktion standardmäßig einen Bestimmten Code abarbeiten lassen. Falls gewünscht, soll sie allerdings den Code einer anderen Funktion abarbeiten.

    Ich hatte mir das so gedacht:

    void * zeigerProzedur();
    void MeineProzedur();

    void * zeigerProzedur()
    {
    ShowMessage("standardCode");
    }

    void MeineProzedur()
    {
    ShowMessage("meinCode");
    }

    int main (void)
    {
    zeigerProzedur = &MeineProzedur;
    zeigerProzedur();
    }

    Als Ergebnis soll dann folgendes rauskommen:

    "meinCode"



  • sowas?

    void zeigerProzedur() 
    { 
    	ShowMessage("standardCode"); 
    } 
    
    void MeineProzedur() 
    { 
    	ShowMessage("meinCode"); 
    } 
    
    int main (void) 
    { 
    	void (*p)(void);
    	p = zeigerProzedur; 
    	p(); 
    	p = MeineProzedur; 
    	p(); 
    }
    


  • Ok, vielen Dank, aber wenn der Funktionszeiger und die Funktion in einer Klasse stecken, geht es nicht mehr.

    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            int (*p)(void);
            int vProz(void);
            __fastcall TForm1(TComponent* Owner);
    };
    
    //---------------------------------------------------------------------------
    int    TForm1::vProz()
    {
            ShowMessage("vProzedur");
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        p = vProz;
        p();
    }
    //---------------------------------------------------------------------------
    

    Compiler:[C++ Fehler] main.cpp(24): E2235 Elementfunktion muß aufgerufen oder ihre Adresse übernommen werden

    Und Visual sagt das:
    C:\Programme\Microsoft Visual Studio\MyProjects\jufo_sim1\copengl.cpp(44) : error C2440: '=' : 'int (__thiscall COpenGLWindow::*)(void)' kann nicht in 'int (__cdecl *)(void)' konvertiert werden



  • Hallo

    dazu brauchst du das Schlüsselwort __closure. Schau dir mal den TNotifyEvent in der BCB-Hilfe an

    bis bald
    akari



  • Gast#649237 schrieb:

    class TForm1 : public TForm
    {
    ...
            int (*p)(void);
    ...
    };
    

    probier mal so:

    class TForm1 : public TForm
    {
    ...
            int (TForm1::*p)();
    ...
    };
    


  • @net: Nein, das funktioniert nicht.
    @akari: Der Code soll nicht nur unter Borland laufen, sondern wird dann später in Visual implementiert.



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        p = vProz;
        this->*p(); // <--- & nets Aenderung nicht vergessen
    }
    //---------------------------------------------------------------------------
    

  • Mod

    du musst eine memberfunktion immer zusammen mit einem objekt aufrufen:

    class foo
    {
    public:
        foo() : bar( &foo::baz ) { };
        void (foo::*bar)(int a);
    private:
        void baz(int a) { std::cout << "foobar" << std::endl; }
    };
    
    int main()
    {
        foo *x = new foo();
        (x->*foo->bar)(0);
        delete x;
    }
    


  • camper schrieb:

    du musst eine memberfunktion immer zusammen mit einem objekt aufrufen[...]

    Nur sofern ich von extern auf die Klasse zugreife.
    Beispiel:

    class meineKlasse
    {
    //...Konstruktor usw. ...
    private:
          void SetFunctionPointer();
          int (*p)();
          int stdFunction();
    };
    
    void meineKlasse::SetFunctionPointer()
    {
          p = stdFunction;
    }
    

  • Mod

    hast du mal versucht, das zu compilieren? bei dir ist p ein ordinärer function pointer, das wird so also kaum funktionieren.
    im übrigen habe ich trotzdem recht. die tatsache, dass du dann (s.o.) this nicht explizit angeben musst, heisst ja nicht, dass die funktion nicht trotzdem zusammen mit einem objekt aufgerufen wird. ich hab ja nicht behauptet, dass man es jedesmal dazuschreiben muss. 🙄



  • Das ist ja das Problem, dass es sich nicht kompilieren lässt.
    Ich will ja auch nur einen "ordinären" Funktionspointer, oder muss man das anders machen???

    Ich schreib nachher mal ein Beispielprogramm, wie ich mir das vorstelle.



  • Gast#649237 schrieb:

    Ich will ja auch nur einen "ordinären" Funktionspointer, oder muss man das anders machen???

    Du kennst doch bestimmt diese lustigen Suchbilder, oder? Wenn du hier ganz genau schaust erkennst vielleicht auch du einen Unterschied:

    // Variante 1
    void bar() { /* ... */ }
    
    // Variante 2
    void foo::bar() { /* ... */ }
    

    Na, klingelt's?


Anmelden zum Antworten