By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,385 Members | 1,737 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,385 IT Pros & Developers. It's quick & easy.

c++ function pointer

P: n/a
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?

Oct 28 '05 #1
Share this Question
Share on Google+
10 Replies


P: n/a
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
Oct 28 '05 #2

P: n/a
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);
Oct 28 '05 #3

P: n/a
"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();
}
Oct 28 '05 #4

P: n/a
* 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?
Oct 28 '05 #5

P: n/a
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;
}
Oct 28 '05 #6

P: n/a
"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();
}
Oct 28 '05 #7

P: n/a
Thanks it's right what I need.

Oct 28 '05 #8

P: n/a
"osmium" <r1********@comcast.net> wrote in message
news:3s************@individual.net...
C c;
c.draw1();
Oops! Shoule be c.draw();
c.change_state();
c.draw();

Oct 28 '05 #9

P: n/a
?

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....

Oct 29 '05 #10

P: n/a

On Fri, 28 Oct 2005 15:48:27 -0400
HappyHippy <ka******@mail.ru> 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

Oct 30 '05 #11

This discussion thread is closed

Replies have been disabled for this discussion.