C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Pointer To Member Functions, Is This Kind of Use SAFE?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ Language (Moderated)
View previous topic :: View next topic  
Author Message
Neal Chen
Guest





PostPosted: Thu Nov 18, 2004 12:08 am    Post subject: Pointer To Member Functions, Is This Kind of Use SAFE? Reply with quote



Hi All,

I am implementing a framework. In my framework, I want to define a set of
handler classes,
deriving from a common base class. Then in the handler classes, I would like
to define a
set of handler functions, all have the same signature, to say, all have the
signature like:
void f(void *)

Then in another loop, I would instantiates those handlers and dynamically
choose a handler
function in a handler class to fulfill a task. Since the concrete handler
and the name of the
handler functions cannot be pre-determinated, I would like to pass in a
pointer to the object
of a handler class and a pointer to member function to the caller, thus in
the caller, I could
compose those two pointers up to call the desired handler function.

The problem, is then, how could I achieve this under a unified interface? I
defined a pointer
to member function type in the Base class scope and try to assign pointer to
derived class's
member functions to variable of this type. Although I have tried this in
both G++ 3.2 and VC7,
I still doubt if such trick is safe, anybody could give me some suggestions
and hints? And
I would appreciate all of your helps.

Following is a sample code I have used for test under G++ and VC7. Thanks in
advance.

#include <iostream>
using namespace std;

class Base{
public:
Base(){}
virtual ~Base(){}

virtual void v() = 0;
};

typedef void (Base::*MemberFunc)(void);

class Derived1 : public Base{
public:
void f(){
cout << "This is in f." << endl;
}

void g(){
cout << "This is in g." << endl;
}

void v(){
cout << "This is in Derived1: v." << endl;
}
};

class Derived2 : public Base{
public:
void h(){
cout << "This is in h." << endl;
}

void m(){
cout << "This is in m." << endl;
}

void v(){
cout << "This is in Derived2: v." << endl;
}
};

class Leaf : public Derived2{
public:
void n(){
cout << "Hello, world, in n." << endl;
}

using Derived2::v;
};

int main(){
MemberFunc fp;
Base *pBase;

Derived1 d1;
Derived2 d2;
Leaf l;

cout << "Test Derived1 ..." << endl;
pBase = &d1;
fp = static_cast cout << "fp to Derived1::f is: " << fp << endl;
(pBase->*fp)();

fp = static_cast<MemberFunc>(&Derived1::g);
cout << "fp to Derived1::g is: " << fp << endl;
(pBase->*fp)();

fp = static_cast<MemberFunc>(&Derived1::v);
cout << "fp to Derived1::v is: " << fp << endl;
(pBase->*fp)();


cout << "Test Derived2 ..." << endl;
pBase = &d2;
fp = static_cast cout << "fp to Derived2::h is: " << fp << endl;
(pBase->*fp)();

fp = static_cast<MemberFunc>(&Derived2::m);
cout << "fp to Derived2::m is: " << fp << endl;
(pBase->*fp)();

fp = static_cast<MemberFunc>(&Derived2::v);
cout << "fp to Derived2::v is: " << fp << endl;
(pBase->*fp)();

cout <<"Test Leaf ..." << endl;
pBase = &l;
fp = static_cast cout << "fp to Leaf::m is: " << fp << endl;
(pBase->*fp)();

fp = static_cast<MemberFunc>(&Leaf::v);
cout << "fp to Leaf::v is: " << fp << endl;
(pBase->*fp)();

return 0;
}


=============================
output:
=============================
Test Derived1 ...
fp to Derived1::f is: 1
This is in f.
fp to Derived1::g is: 1
This is in g.
fp to Derived1::v is: 1
This is in Derived1: v.
Test Derived2 ...
fp to Derived2::h is: 1
This is in h.
fp to Derived2::m is: 1
This is in m.
fp to Derived2::v is: 1
This is in Derived2: v.
Test Leaf ...
fp to Leaf::m is: 1
Hello, world, in n.
fp to Leaf::v is: 1
This is in Derived2: v.

========================================
BTW: it's queer that the output of "fp to XXXX is:" lines are always 1,
both in output of G++ and VC. Anybody could explain this to me?



[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

Back to top
syro555
Guest





PostPosted: Fri Nov 19, 2004 4:54 pm    Post subject: Re: Pointer To Member Functions, Is This Kind of Use SAFE? Reply with quote



Neal Chen wrote:

Quote:
Hi All,

...

========================================
BTW: it's queer that the output of "fp to XXXX is:" lines are always 1,
both in output of G++ and VC. Anybody could explain this to me?


cout << "fp to Leaf::v is: " << fp << endl;

should be

cout << "fp to Leaf::v is: " << (void *)fp << endl;

printing function pointer using ostream will always give output '1'

[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

Back to top
Branimir Maksimovic
Guest





PostPosted: Fri Nov 19, 2004 4:55 pm    Post subject: Re: Pointer To Member Functions, Is This Kind of Use SAFE? Reply with quote



"Neal Chen" <zeusnchen (AT) msn (DOT) com> wrote

Quote:
Hi All,
..............
The problem, is then, how could I achieve this under a unified interface? I
defined a pointer
to member function type in the Base class scope and try to assign pointer to
derived class's
member functions to variable of this type. Although I have tried this in
both G++ 3.2 and VC7,
I still doubt if such trick is safe, anybody could give me some suggestions
and hints? And
I would appreciate all of your helps.

Well, static_cast works in this case?
if you are sure that object and function
pointers matches right type, then it is safe.

Greetings, Bane.

[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ Language (Moderated) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.