Main > Software Forum

Help requested: C++ member function pointers

<< < (3/4) > >>

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