daniel@saturn.ucsc.edu (Daniel Edelson) (02/15/89)
Can somebody please enlighten me as to why this does not work. It declares a member that points to a member function. The constructor initializes the pointer based on an argument. When calling through the pointer to function the argument gets lost. This can be fixed with pointers to member but I'd like to understand why it doesn't work as simple pointers to functions. We've tried this under cfront 1.2.1 and under oregon C++. #include <stream.h> typedef void (*ptr_f)(int); // simple pointer to func type class FUNC { public: ptr_f pF; void F1(int i) { cout << "F1: " << i << "\n"; } void F2(int i) { cout << "F2: " << i << "\n"; } FUNC(int i) { if (i==0) pF= (ptr_f) &(FUNC::F1); // point at F1 else pF= (ptr_f) &(FUNC::F2); // point at F2 } }; main() { FUNC Q(1); // Select F2 Q.F1(10000); // invoke F1 directly Q.F2(10000); // invoke F2 directly (Q.pF)(10000); // invoke F2 indirectly, 10000 gets lost } A solution using pointers to member is: #include <stream.h> class FUNC ; // forward decl typedef void (FUNC::*ptr_mf)(int); // pointer to member type class FUNC { public: ptr_mf pF; void F1(int i) { cout << "F1: " << i << "\n"; } void F2(int i) { cout << "F2: " << i << "\n"; } FUNC(int i) { if(i==0) pF= &(FUNC::F1); else pF= &(FUNC::F2); } }; main() { FUNC Q(1); Q.F1(10000); Q.F2(10000); (Q.*(Q.pF))(10000); //Yuck! } =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Daniel Edelson daniel@saturn.ucsc.edu