Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Soluzione elegante al seguente problema

0 views
Skip to first unread message

Anonimo

unread,
Nov 17, 2009, 1:18:32 PM11/17/09
to
Salve,

qualcuno ha qualche idea piᅵ elegante al seguente problema riportato
nelle righe di commento di seguito (cosᅵ che possiate eventualmente fare
un copia incolla nel vostro editor preferito e avere il testo
sott'occhio)? In sostanza ho la necessitᅵ di legare un puntatore a
funzione a una funzione virtuale membro di una classe, nella maniera piᅵ
pulita possibile.


---


/*
* Si consideri un'interfaccia (non modificabile) fornita da una
* libreria C costituita da una struttura S cosᅵ definita:
*/
struct S {
void *o;
void (*callback)(S* p);
};

/* PROBLEMA:
* Avendo a disposizione questi due membri, vorrei trovare un modo
* elegante per legare S::callback() a una funzione membro virtuale f()
* di una classe astratta A da me definita, in modo tale che il
* comportamento di callback() sia determinato dinamicamente.
* Esiste una soluzione piᅵ elegante rispetto a quella
* che ho riportato nell'esempio che segue?
*/

#include <iostream.h>

/*
* Definisco la mia interfaccia come classe astratta.
*/
class A {
public:
virtual void f() = 0;
static void wrapper(S* p) {((A*)(p->o))->f();};
};

/*
* Definisco alcune classi derivate utili per l'esempio.
*/
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) {

// collegamento dinamico
if (argc > 1)
a = new(B);
else
a = new(C);

// E altrove:
s.callback = A::wrapper;
s.o = a;
s.callback(&s); // comportamento dinamico

return 0;
}

0 new messages