c++ function pointer

M

Marco

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?
 
V

Victor Bazarov

Marco said:
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
 
N

n2xssvv g02gfr12930

Marco said:
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
 
O

osmium

Marco said:
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();
}
 
A

Alf P. Steinbach

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

HappyHippy

Marco said:
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;
}
 
O

osmium

Marco said:
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();
}
 
A

Andrej Hristoliubov

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

gary

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
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,900
Latest member
Nell636132

Latest Threads

Top