FunctionsPointer



  • This code läuft fehlerfrei:

    void Func1( void ) {
    cout<<"HALLO!"<<endl;}
    void ( *FuncPtr1 )( void )=Func1 ;
    
    void main( void ){  
      ( FuncPtr1 )( ) ;
    }
    

    und hier bekomme ich einen Fehlerc:error C2440: '=' : cannot convert from 'void' to 'void (__cdecl *)(void)'

    #include <iostream>
    using namespace std;
    
    class dummy{
    	public:
    		void(*pf)(void);
    		void func(void){cout<<"HALLO!"<<endl;}
    		dummy(){
    			pf=func;
    		}
    	private:
    
    };
    
    int main(){
    	dummy d;
    	d.pf();
    }
    

    Was ist hier falsch??


  • Mod

    carmen schrieb:

    class dummy{
    	public:
    		void(*pf)(void);
    		void func(void){cout<<"HALLO!"<<endl;}
    		dummy(){
    			pf=func;
    		}
    };
    

    Was ist hier falsch??

    func ist eine nichtstatische memberfunktion und kann nicht in einen funktionspointer umgewandelt werden. was du hier benötigst ist ein memberfunktionspointer:

    class dummy{
    	public:
    		void(dummy::*pf)(void);
    		void func(void){cout<<"HALLO!"<<endl;}
    		dummy(){
    			pf=&func;
    		}
    };
    int main(){
        dummy d;
        (d.*pf)();
    }
    


  • ➡ Post von camper

    Greetz, Swordfish



  • Danke! aber

    funktioniert nicht

    Error:'pf':undeclared identifier


  • Mod

    carmen schrieb:

    Danke! aber

    funktioniert nicht

    Error:'pf':undeclared identifier

    stimmt. muss nat.

    (d.*d.pf)()
    

    heißen.



  • - humbug gestrichen -

    Mit dem alten Code bekommt mein GCC:

    ISO C++ forbids taking the address of an unqualified non-static member function to form a pointer to member function.  Say `&dummy::func'
    

    EDIT:
    Okay, mein Fehler - leuchtet ein.

    Weiterführende Frage:
    Verbietet ISO C++ jetzt die Adresse eines non-static Member zu nehmen oder meint G++ das nur?


  • Mod

    LordJaxom schrieb:

    - humbug gestrichen -

    Mit dem alten Code bekommt mein GCC:

    ISO C++ forbids taking the address of an unqualified non-static member function to form a pointer to member function.  Say `&dummy::func'
    

    EDIT:
    Okay, mein Fehler - leuchtet ein.

    Weiterführende Frage:
    Verbietet ISO C++ jetzt die Adresse eines non-static Member zu nehmen oder meint G++ das nur?

    die fehlermeldung ist schon korrekt insofern, als das man immer den qualifizierten namen des members benutzen muss (selbst wenn es im scope ist) - das war in meinem code also auch noch falsch. ansonsten ist es eine frage der definition von adresse. im allgemeinen würde ich für eine beliebige entität x als adresse den wert dieses ausdrucks ansehen:

    typedef size_t address_type; // oder ein anderer geeigneter typ
    address_type address = reinterpret_cast<address_type>(reinterpret_cast<void*>(&x));
    

    und das scheitert für funktionen und member bereits daran, dass der cast nach void* bereits nicht möglich ist (das ist vorgesehn für funktionen als conditionally defined im nächsten standard). man kann sich auch leicht überlegen, warum diese definition für member keinen sinn macht: ein pointer to member ist ja letzlich nur so etwas wie ein offset. tatsächlich könnte eine implementation schlicht so arbeiten:

    reinterpret_cast<size_t>(&T::x)==offsetof(T,x)
    

    wobei wir dann nicht auf PODs beschränkt sind.



  • @camper.
    DANKE!


Anmelden zum Antworten