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

    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