Main > Software Forum
Help requested: C++ member function pointers
Spartan:
See my first reply -- make the member functions static, then pass in the ex as an argument....
screaming:
What if you have 2 classes?
--- Code: ---#include <stdio.h>
// CLASS: ExampleFuncs
class ExampleFuncs
{
public:
static int foo(void);
static int bar(void);
};
int ExampleFuncs::foo(void)
{
return 1;
}
int ExampleFuncs::bar(void)
{
return 2;
}
class ExampleClass
{
public:
int (*member_fn)(void);
int member_int;
int foo(void);
int bar(void);
void SetFoo(void);
void SetBar(void);
int CallMember(void);
};
void ExampleClass::SetFoo(void)
{
member_int=ExampleFuncs::foo();
member_fn = &ExampleFuncs::foo;
}
void ExampleClass::SetBar(void)
{
member_int=ExampleFuncs::bar();
member_fn=&ExampleFuncs::bar;
}
int ExampleClass::CallMember(void)
{
return (*member_fn)();
}
main(int argc, char **argv)
{
ExampleClass ex;
int result;
ex.SetFoo();
printf("result from SetFoo=%d, member_int=%d\n",
ex.CallMember(),ex.member_int);
ex.SetBar();
printf("result from SetBar=%d, member_int=%d\n",
ex.CallMember(),ex.member_int);
return 0;
}
--- End code ---
It compiles on Linux.....
steveb@freda ~/budda $ gcc -lstdc++ -o test main.cpp
steveb@freda ~/budda $ ./test
result from SetFoo=1, member_int=1
result from SetBar=2, member_int=2
steveb@freda ~/budda $
Buddabing:
That won't work because foo() and bar() need to access member_int directly.
Spartan:
I keep telling you -- pass in ex as an argument!
--- Code: ---#include <stdio.h>
class ExampleClass
{
public:
int (*member)(ExampleClass e);
static int foo(ExampleClass e)
{
return 1;
}
static int bar(ExampleClass e)
{
return 2;
}
void SetFoo(void)
{
member=&ExampleClass::foo; // <----------------error here
}
void SetBar(void)
{
member=&ExampleClass::bar; // <----------------error here
}
int CallMember(ExampleClass e)
{
return (*member)(e);
}
};
int main(int argc, char **argv)
{
ExampleClass ex;
int result;
ex.SetFoo();
printf("result from SetFoo=%d\n",ex.CallMember(ex));
ex.SetBar();
printf("result from SetBar=%d\n",ex.CallMember(ex));
return 0;
}
--- End code ---
Buddabing:
Okay, this works, like Spartan said, pass a pointer to the class as a parameter to any function which can be assigned to a function pointer, then members of the class can be accessed from the statically declared members.
--- Code: ---
#include <stdio.h>
class ExampleClass
{
public:
int (*member_fn)(ExampleClass *);
int member_int;
static int foo(ExampleClass *);
static int bar(ExampleClass *);
void SetFoo(void);
void SetBar(void);
int CallMember(ExampleClass *);
};
int ExampleClass::foo(ExampleClass *e)
{
e->member_int=1;
return 1;
}
int ExampleClass::bar(ExampleClass *e)
{
e->member_int=2;
return 2;
}
void ExampleClass::SetFoo(void)
{
member_fn=&ExampleClass::foo;
}
void ExampleClass::SetBar(void)
{
member_fn=&ExampleClass::bar;
}
int ExampleClass::CallMember(ExampleClass *e)
{
return (*member_fn)(e);
}
main(int argc, char **argv)
{
ExampleClass ex;
int result;
ex.SetFoo();
printf("result from SetFoo=%d, member_int=%d\n",
ex.CallMember(&ex),ex.member_int);
ex.SetBar();
printf("result from SetBar=%d, member_int=%d\n",
ex.CallMember(&ex),ex.member_int);
return 0;
}
--- End code ---
Thanks all!
Navigation
[0] Message Index
[#] Next page
[*] Previous page
Go to full version