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??
-
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)(); }
-
Greetz, Swordfish
-
Danke! aber
funktioniert nicht
Error:'pf':undeclared identifier
-
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?
-
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!