c++ function pointer

Discussion in 'C++' started by Marco, Oct 28, 2005.

  1. Marco

    Marco Guest

    Hi,

    I would like implement a class with a method Draw(),
    ..I would like that method Draw() change with another method when the
    state of class change.
    I think to use function pointer to do it, but I don't know how use this
    in a class?
    Can someone do a example?
    Marco, Oct 28, 2005
    #1
    1. Advertising

  2. Marco wrote:
    > I would like implement a class with a method Draw(),


    class a_class {
    void Draw();
    };

    > .I would like that method Draw() change with another method when the
    > state of class change.


    What does it mean "method Draw() change"? How can a method change?

    > I think to use function pointer to do it, but I don't know how use this
    > in a class?


    I don't think there is a need of any pointer. Just implement your 'Draw'
    so that it checks the "state of class" and behaves accordingly:

    void a_class::Draw() {
    if (state_didnt_change) // whatever that means
    ; // do something here
    else // the state has changed
    ; // do something different
    }

    > Can someone do a example?


    I can do a example alright. Just give me the example and I'll do it.

    V
    Victor Bazarov, Oct 28, 2005
    #2
    1. Advertising

  3. Marco wrote:
    > Hi,
    >
    > I would like implement a class with a method Draw(),
    > .I would like that method Draw() change with another method when the
    > state of class change.
    > I think to use function pointer to do it, but I don't know how use this
    > in a class?
    > Can someone do a example?
    >

    Marco,

    Why not create a base class with the Draw() method being declared as
    virtual and use a pointer to the base class. The actual Draw() function
    can then be defined in descendant classes, (see below).

    class Shape
    {
    public:
    virtual void Draw(void);
    .
    .
    .
    };

    class Square : public Shape
    {
    public:
    void Draw(void);
    .
    .
    .
    }

    class Circle : public Shape
    {
    public:
    void Draw(void);
    .
    .
    .
    }

    As for a pointer to a member function see below.

    {
    void (Shape::*pFnc)(void) = &Shape::Draw
    Shape Sample;
    (Sample.*pFn)(); // Will call Shape::Draw() function
    }

    JFJB
    n2xssvv g02gfr12930, Oct 28, 2005
    #3
  4. Marco

    osmium Guest

    "Marco" writes:

    > I would like implement a class with a method Draw(),
    > .I would like that method Draw() change with another method when the
    > state of class change.
    > I think to use function pointer to do it, but I don't know how use this
    > in a class?
    > Can someone do a example?


    Do you know about polymorphism in C++? Perhaps that will help you do what
    you want. If you want to stick with the function pointer approach, here is
    a sample of the rather nasty syntax. But note that the function pointer is
    in main and not in the class. But there is a way to get access to the state
    variable should you wish to. I can show you how to get it too, but first I
    think you should knowingly reject the polymorphic approach.

    #include <iostream>

    class C
    {
    public:
    void draw();
    private:
    int state; // igonred in this test program
    };
    //--------------
    void C::draw()
    {
    std::cout << "draw called\n";
    }
    //==================
    int main()
    {
    C object;
    typedef void( C::*PMF) (); // for clarity
    PMF pmf; // pointer to member function
    pmf = &C::draw; // select desired member function
    (object.*pmf) (); // call it

    std::cin.get();
    }
    osmium, Oct 28, 2005
    #4
  5. * Marco:
    >
    > I would like implement a class with a method Draw(),
    > .I would like that method Draw() change with another method when the
    > state of class change.
    > I think to use function pointer to do it, but I don't know how use this
    > in a class?
    > Can someone do a example?


    Use a pointer to an instance of a class with a virtual member function.


    --
    A: Because it messes up the order in which people normally read text.
    Q: Why is it such a bad thing?
    A: Top-posting.
    Q: What is the most annoying thing on usenet and in e-mail?
    Alf P. Steinbach, Oct 28, 2005
    #5
  6. Marco

    HappyHippy Guest

    Marco wrote:
    > Hi,
    >
    > I would like implement a class with a method Draw(),
    > .I would like that method Draw() change with another method when the
    > state of class change.
    > I think to use function pointer to do it, but I don't know how use this
    > in a class?
    > Can someone do a example?
    >


    You can do something like that:

    #include <iostream>


    class CMYClass
    {
    public:
    enum E_STATE
    {
    E_ST1,
    E_ST2,
    E_ST3
    };
    CMYClass():
    m_pDrawFnc(&CMYClass::draw_S1)
    {
    }

    void draw()
    {
    (this->*m_pDrawFnc)();
    }

    void changeState(E_STATE eState)
    {
    switch(eState)
    {
    case E_ST1:
    m_pDrawFnc = &CMYClass::draw_S1;
    return;

    case E_ST2:
    m_pDrawFnc = &CMYClass::draw_S2;
    return;

    case E_ST3:
    m_pDrawFnc = &CMYClass::draw_S3;
    return;

    default:
    //invalid argument!
    return;
    }
    }

    private:
    void draw_S1()
    {
    std::cout<<"draw_S1"<<std::endl;
    }
    void draw_S2()
    {
    std::cout<<"draw_S2"<<std::endl;
    }
    void draw_S3()
    {
    std::cout<<"draw_S3"<<std::endl;
    }

    typedef void (CMYClass::*draw_fnc)();

    E_STATE m_eState;
    draw_fnc m_pDrawFnc;
    };

    int main()
    {
    CMYClass obj;
    obj.draw();
    obj.changeState(CMYClass::E_ST2);
    obj.draw();
    obj.changeState(CMYClass::E_ST3);
    obj.draw();

    return 0;
    }
    HappyHippy, Oct 28, 2005
    #6
  7. Marco

    osmium Guest

    "Marco" writes:

    > I would like implement a class with a method Draw(),
    > .I would like that method Draw() change with another method when the
    > state of class change.
    > I think to use function pointer to do it, but I don't know how use this
    > in a class?
    > Can someone do a example?


    I think I was seduced by your talk of a function pointer in my earlier post.
    As I read your post literally, and ignoring your speculation, it seems you
    simply want something like this.

    #include <iostream>

    class C
    {
    public:
    C() {state = 0;}
    void draw();
    void change_state() { state = 1;}
    void draw1() {std::cout << "draw1 called\n";}
    void draw2() {std::cout << "draw2 called\n";}
    private:
    int state;
    };
    //---------------------
    void C::draw()
    {
    if (state == 0)
    draw1();
    else
    draw2();
    }
    //=================
    int main()
    {
    C c;
    c.draw1();
    c.change_state();
    c.draw();

    std::cin.get();
    }
    osmium, Oct 28, 2005
    #7
  8. Marco

    Marco Guest

    Thanks it's right what I need.
    Marco, Oct 28, 2005
    #8
  9. Marco

    osmium Guest

    "osmium" <> wrote in message
    news:...

    > C c;
    > c.draw1();


    Oops! Shoule be c.draw();

    > c.change_state();
    > c.draw();
    osmium, Oct 29, 2005
    #9
  10. ?
    >
    > I can do a example alright. Just give me the example and I'll do it.
    >
    > V

    Vitya is right again!!!

    Do listen to Victor, I neither had seen this in production not
    Victor's code. And I know Victor for quite some time now (Vitya is it
    25 or 30 years in total is the duration of our acquaintance and
    bestfriendship?).


    hi to babulya....
    Andrej Hristoliubov, Oct 29, 2005
    #10
  11. Marco

    gary Guest

    On Fri, 28 Oct 2005 15:48:27 -0400
    HappyHippy <> wrote:

    > Marco wrote:
    > > Hi,
    > >
    > > I would like implement a class with a method Draw(),
    > > .I would like that method Draw() change with another method when the
    > > state of class change.
    > > I think to use function pointer to do it, but I don't know how use this
    > > in a class?
    > > Can someone do a example?
    > >

    >
    > You can do something like that:
    >
    > #include <iostream>
    >
    >
    > class CMYClass
    > {
    > public:
    > enum E_STATE
    > {
    > E_ST1,
    > E_ST2,
    > E_ST3
    > };
    > CMYClass():
    > m_pDrawFnc(&CMYClass::draw_S1)
    > {
    > }
    >
    > void draw()
    > {
    > (this->*m_pDrawFnc)();
    > }
    >
    > void changeState(E_STATE eState)
    > {
    > switch(eState)
    > {
    > case E_ST1:
    > m_pDrawFnc = &CMYClass::draw_S1;
    > return;
    >
    > case E_ST2:
    > m_pDrawFnc = &CMYClass::draw_S2;
    > return;
    >
    > case E_ST3:
    > m_pDrawFnc = &CMYClass::draw_S3;
    > return;
    >
    > default:
    > //invalid argument!
    > return;
    > }
    > }
    >
    > private:
    > void draw_S1()
    > {
    > std::cout<<"draw_S1"<<std::endl;
    > }
    > void draw_S2()
    > {
    > std::cout<<"draw_S2"<<std::endl;
    > }
    > void draw_S3()
    > {
    > std::cout<<"draw_S3"<<std::endl;
    > }
    >
    > typedef void (CMYClass::*draw_fnc)();
    >
    > E_STATE m_eState;
    > draw_fnc m_pDrawFnc;
    > };
    >
    > int main()
    > {
    > CMYClass obj;
    > obj.draw();
    > obj.changeState(CMYClass::E_ST2);
    > obj.draw();
    > obj.changeState(CMYClass::E_ST3);
    > obj.draw();
    >
    > return 0;
    > }


    I think the resolution is still not adequate.
    If the collection of states you need is greater than E_STATE, what should you do?
    I think using a integer variable or array is simple, every bit of the variable represents a state or simplely the value of the variable represents states
    gary, Oct 30, 2005
    #11
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. glen stark
    Replies:
    2
    Views:
    703
    Ron Natalie
    Oct 10, 2003
  2. Fraser Ross
    Replies:
    4
    Views:
    1,043
    Fraser Ross
    Aug 14, 2004
  3. murgan
    Replies:
    6
    Views:
    4,861
    Thad Smith
    Dec 21, 2005
  4. Vijai Kalyan
    Replies:
    4
    Views:
    704
    Vijai Kalyan
    Nov 8, 2005
  5. Replies:
    3
    Views:
    306
    Philip Potter
    Apr 11, 2008
Loading...

Share This Page