Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Function Pointers in Classes

Function Pointers in Classes

Scheduled Pinned Locked Moved C / C++ / MFC
csharpc++visual-studiohelpquestion
14 Posts 7 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • A Arsalan Malik

    I have two independent C++ classes, A and B. I have a non-static public function in class A

    void display(char *msg);

    I want to have its function pointer as a public member of class B, without information that it belongs to class A, e.g in class B, I have:

    void (*display)(char*);

    I have a member of class B in class A, and I am trying to set function pointer as:

    B b;
    b.display = &A::display;

    I get the following compiler error:

    error: '=' : cannot convert from 'void (__thiscall A::* )(char *)' to 'void (__cdecl *)(char *)'

    I am using Visual Studio 2005. Can any one let me know a proper way of doing this?

    ARSALAN MALIK

    D Offline
    D Offline
    Divyang Mithaiwala
    wrote on last edited by
    #4

    What you have done is shown that you want some common operation in display method of class A & class B. So, for that here you can take one base class which define display method. And after that you can inherit your 2 classes A & B from that base class. Both have access of display method.


    Do not trust a computer... Always check what computer is doing regards, Divyang Mithaiwala Software Engineer

    1 Reply Last reply
    0
    • A Arsalan Malik

      I have two independent C++ classes, A and B. I have a non-static public function in class A

      void display(char *msg);

      I want to have its function pointer as a public member of class B, without information that it belongs to class A, e.g in class B, I have:

      void (*display)(char*);

      I have a member of class B in class A, and I am trying to set function pointer as:

      B b;
      b.display = &A::display;

      I get the following compiler error:

      error: '=' : cannot convert from 'void (__thiscall A::* )(char *)' to 'void (__cdecl *)(char *)'

      I am using Visual Studio 2005. Can any one let me know a proper way of doing this?

      ARSALAN MALIK

      S Offline
      S Offline
      Stuart Dootson
      wrote on last edited by
      #5

      I would implement this using Boost.Function[^] and Boost.Bind[^]: In class B, declare display like this:

      boost::function<void(char*)> display;

      in A, set b.display like this:

      B b;
      b.display = boost::bind(&A::display, this);

      in B, call it like this:

      if (display) display(whatever string you want to display

      The if (display) bit is to protect you against the case that nothing's been assigned to B::display. Here's a complete, buildable and runnable example:

      #include <iostream>
      #include <boost/bind.hpp>
      #include <boost/function.hpp>

      class B
      {
      public:
      boost::function<void(char*)> display;
      void b_test() { if (display) display("test"); }
      };

      class A
      {
      public:
      A() { b.display = boost::bind(&A::display, this, _1); }
      void a_test() { b.b_test(); }
      void display(char* s) { std::cout << s << std::endl; }
      B b;
      };

      int main()
      {
      A a;
      a.a_test();
      }

      Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p

      L 1 Reply Last reply
      0
      • S Stuart Dootson

        I would implement this using Boost.Function[^] and Boost.Bind[^]: In class B, declare display like this:

        boost::function<void(char*)> display;

        in A, set b.display like this:

        B b;
        b.display = boost::bind(&A::display, this);

        in B, call it like this:

        if (display) display(whatever string you want to display

        The if (display) bit is to protect you against the case that nothing's been assigned to B::display. Here's a complete, buildable and runnable example:

        #include <iostream>
        #include <boost/bind.hpp>
        #include <boost/function.hpp>

        class B
        {
        public:
        boost::function<void(char*)> display;
        void b_test() { if (display) display("test"); }
        };

        class A
        {
        public:
        A() { b.display = boost::bind(&A::display, this, _1); }
        void a_test() { b.b_test(); }
        void display(char* s) { std::cout << s << std::endl; }
        B b;
        };

        int main()
        {
        A a;
        a.a_test();
        }

        Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p

        L Offline
        L Offline
        led mike
        wrote on last edited by
        #6

        Stuart Dootson wrote:

        I would implement this using Boost.Function[^] and Boost.Bind[^]:

        The Visual C++ 2008 Feature Pack has implemented TR1[^] Although, I would prefer using interfaces as Stephen Hewitt posted.

        S 1 Reply Last reply
        0
        • A Arsalan Malik

          I have two independent C++ classes, A and B. I have a non-static public function in class A

          void display(char *msg);

          I want to have its function pointer as a public member of class B, without information that it belongs to class A, e.g in class B, I have:

          void (*display)(char*);

          I have a member of class B in class A, and I am trying to set function pointer as:

          B b;
          b.display = &A::display;

          I get the following compiler error:

          error: '=' : cannot convert from 'void (__thiscall A::* )(char *)' to 'void (__cdecl *)(char *)'

          I am using Visual Studio 2005. Can any one let me know a proper way of doing this?

          ARSALAN MALIK

          C Offline
          C Offline
          CPallini
          wrote on last edited by
          #7

          Why do you want to follow a very plain-C path? You know, C++ is a fully featured OOP launguage. :)

          If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
          This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
          [My articles]

          A 1 Reply Last reply
          0
          • L led mike

            Stuart Dootson wrote:

            I would implement this using Boost.Function[^] and Boost.Bind[^]:

            The Visual C++ 2008 Feature Pack has implemented TR1[^] Although, I would prefer using interfaces as Stephen Hewitt posted.

            S Offline
            S Offline
            Stuart Dootson
            wrote on last edited by
            #8

            led mike wrote:

            The Visual C++ 2008 Feature Pack has implemented TR1[^]

            Caught me - I've not got used to having TR1 yet. Also, TR1 doesn't have Boost.Bind in it :-( (or Boost.Lambda, for that matter - even more :-()

            led mike wrote:

            Although, I would prefer using interfaces as Stephen Hewitt posted.

            Fair enough - each approach has its own benefits and drawbacks.

            Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p

            L 1 Reply Last reply
            0
            • S Stuart Dootson

              led mike wrote:

              The Visual C++ 2008 Feature Pack has implemented TR1[^]

              Caught me - I've not got used to having TR1 yet. Also, TR1 doesn't have Boost.Bind in it :-( (or Boost.Lambda, for that matter - even more :-()

              led mike wrote:

              Although, I would prefer using interfaces as Stephen Hewitt posted.

              Fair enough - each approach has its own benefits and drawbacks.

              Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p

              L Offline
              L Offline
              led mike
              wrote on last edited by
              #9

              Stuart Dootson wrote:

              Also, TR1 doesn't have Boost.Bind in it Frown (or Boost.Lambda, for that matter - even more Frown)

              Well no, there is no Boost namespace but those features are in TR1.

              S 1 Reply Last reply
              0
              • L led mike

                Stuart Dootson wrote:

                Also, TR1 doesn't have Boost.Bind in it Frown (or Boost.Lambda, for that matter - even more Frown)

                Well no, there is no Boost namespace but those features are in TR1.

                S Offline
                S Offline
                Stuart Dootson
                wrote on last edited by
                #10

                So it is (Boost.Bind equivalent, that is)! Well, you learn something new every day! So, come VS2010, when C++0x lambdas are available, I'll be well happy :-)

                Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p

                L C 2 Replies Last reply
                0
                • S Stuart Dootson

                  So it is (Boost.Bind equivalent, that is)! Well, you learn something new every day! So, come VS2010, when C++0x lambdas are available, I'll be well happy :-)

                  Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p

                  L Offline
                  L Offline
                  led mike
                  wrote on last edited by
                  #11

                  Stuart Dootson wrote:

                  lambdas are available

                  Yeah, I suppose that's a good thing, we'll see.

                  1 Reply Last reply
                  0
                  • S Stuart Dootson

                    So it is (Boost.Bind equivalent, that is)! Well, you learn something new every day! So, come VS2010, when C++0x lambdas are available, I'll be well happy :-)

                    Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p

                    C Offline
                    C Offline
                    CPallini
                    wrote on last edited by
                    #12

                    Stuart Dootson wrote:

                    Well, you learn something new every day!

                    Get in times Stuart! ;P of course I knew nothing about... :rolleyes:

                    If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
                    This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
                    [My articles]

                    1 Reply Last reply
                    0
                    • C CPallini

                      Why do you want to follow a very plain-C path? You know, C++ is a fully featured OOP launguage. :)

                      If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
                      This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
                      [My articles]

                      A Offline
                      A Offline
                      Arsalan Malik
                      wrote on last edited by
                      #13

                      You are right, thanks, perhaps I am thinking too much in C :-D

                      ARSALAN MALIK

                      1 Reply Last reply
                      0
                      • S Stephen Hewitt

                        Firstly, your approach using void (*display)(char*); doesn't work as it points to a global or static class member function, not a member function. One way to to do it is the following, assuming the function to be called is always display:

                        1. Define an interface that contains the function:

                          class ICallable
                          {
                          public:
                          virtual void display(char *msg) = 0;
                          };

                          Note the function is a pure virtual function.

                        2. Derive the classes that have the function to be called from it:

                          class A : public ICallable
                          {
                          public:
                          virtual void display(char *msg)
                          {
                          // A's impelentation here...
                          }
                          };

                        3. Your pointer now looks like the following:

                          ICallable *pPointer;

                        4. The call through the pointer like this:

                          pPointer->display("Hello world!");

                        Steve

                        A Offline
                        A Offline
                        Arsalan Malik
                        wrote on last edited by
                        #14

                        Thanks a lot for the hint, perhaps I was thinking too much in C :-D

                        ARSALAN MALIK

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • World
                        • Users
                        • Groups