A
Anonimo
Hello,
I would like to see a cleaner solution than the one I have written in
the example below for passing a pointer-to-a-virtual member function of
an abstract class to a function pointer.
/*
* Suppose this is the interface provided as API by an external library
* written in C, containing the pointer to a function to be called by
* the library itself.
*/
struct S {
void *o;
void (*callback)(S* p);
};
#include <iostream.h>
/*
* This is my abstract class with the virtual member function.
*/
class A {
public:
virtual void f() = 0;
static void wrapper(S* p) {((A*)(p->o))->f();};
};
/*
* These are derived classes.
*/
class B : public A {
void f() {cout << "B::f() called\n";};
};
class C : public A {
void f() {cout << "C::f() called\n";};
};
S s;
A* a;
int main(int argc, char**argv) {
// dynamic linking
if (argc > 1)
a = new(B);
else
a = new(C);
s.callback = A::wrapper;
s.o = a;
//...
s.callback(&s); // dynamic behaviour in the library
return 0;
}
I would like to see a cleaner solution than the one I have written in
the example below for passing a pointer-to-a-virtual member function of
an abstract class to a function pointer.
/*
* Suppose this is the interface provided as API by an external library
* written in C, containing the pointer to a function to be called by
* the library itself.
*/
struct S {
void *o;
void (*callback)(S* p);
};
#include <iostream.h>
/*
* This is my abstract class with the virtual member function.
*/
class A {
public:
virtual void f() = 0;
static void wrapper(S* p) {((A*)(p->o))->f();};
};
/*
* These are derived classes.
*/
class B : public A {
void f() {cout << "B::f() called\n";};
};
class C : public A {
void f() {cout << "C::f() called\n";};
};
S s;
A* a;
int main(int argc, char**argv) {
// dynamic linking
if (argc > 1)
a = new(B);
else
a = new(C);
s.callback = A::wrapper;
s.o = a;
//...
s.callback(&s); // dynamic behaviour in the library
return 0;
}