A l'intérieur de cette fonction le type "type" est utilisable.
Peut-on le sauvegarder au sein de la classe pour pouvoir l'utiliser dans une
autre fonction de cette meme classe ?
A l'intérieur de cette fonction le type "type" est utilisable. Peut-on le sauvegarder au sein de la classe pour pouvoir l'utiliser dans une autre fonction de cette meme classe ?
Qu'est-ce que tu entends par sauvegarder ? Et quelle utilisation veux-tu en faire dans ton autre fonction ?
A l'intérieur de cette fonction le type "type" est utilisable.
Peut-on le sauvegarder au sein de la classe pour pouvoir l'utiliser dans une
autre fonction de cette meme classe ?
Qu'est-ce que tu entends par sauvegarder ? Et quelle utilisation veux-tu
en faire dans ton autre fonction ?
A l'intérieur de cette fonction le type "type" est utilisable. Peut-on le sauvegarder au sein de la classe pour pouvoir l'utiliser dans une autre fonction de cette meme classe ?
Qu'est-ce que tu entends par sauvegarder ? Et quelle utilisation veux-tu en faire dans ton autre fonction ?
-- Christophe de Vienne
PurL
Qu'est-ce que tu entends par sauvegarder ? Et quelle utilisation veux-tu en faire dans ton autre fonction ?
Toujours mon histoire de callback. Si je ne peux pas passer une fonction membre, je passe l'objet, mais il peut avoir plusieur type différent :
class CallBack { template <class type> void fct(type *frm); type *m_frm; void AutreFonction(); };
template <class type> void CallBack::fct(type *frm) { //je sauvegarde frm dans une variable membre, mais cette //variable doit etre du meme type que frm m_frm = frm; }
void CallBack::AutreFonction() { //ici je voudais faire : m_frm->FonctionCallBack(); }
Bien evidement, chaque classe qui desire que la class CallBack les appelle doivent avoir toute la fonction membre FonctionCallBack().
Merci pour votre aide,
PurL
Qu'est-ce que tu entends par sauvegarder ? Et quelle utilisation
veux-tu en faire dans ton autre fonction ?
Toujours mon histoire de callback.
Si je ne peux pas passer une fonction membre, je passe l'objet, mais il peut
avoir plusieur type différent :
class CallBack
{
template <class type> void fct(type *frm);
type *m_frm;
void AutreFonction();
};
template <class type> void CallBack::fct(type *frm)
{
//je sauvegarde frm dans une variable membre, mais cette
//variable doit etre du meme type que frm
m_frm = frm;
}
void CallBack::AutreFonction()
{
//ici je voudais faire :
m_frm->FonctionCallBack();
}
Bien evidement, chaque classe qui desire que la class CallBack les appelle
doivent avoir toute la fonction membre FonctionCallBack().
Qu'est-ce que tu entends par sauvegarder ? Et quelle utilisation veux-tu en faire dans ton autre fonction ?
Toujours mon histoire de callback. Si je ne peux pas passer une fonction membre, je passe l'objet, mais il peut avoir plusieur type différent :
class CallBack { template <class type> void fct(type *frm); type *m_frm; void AutreFonction(); };
template <class type> void CallBack::fct(type *frm) { //je sauvegarde frm dans une variable membre, mais cette //variable doit etre du meme type que frm m_frm = frm; }
void CallBack::AutreFonction() { //ici je voudais faire : m_frm->FonctionCallBack(); }
Bien evidement, chaque classe qui desire que la class CallBack les appelle doivent avoir toute la fonction membre FonctionCallBack().
A l'intérieur de cette fonction le type "type" est utilisable. Peut-on le sauvegarder au sein de la classe pour pouvoir l'utiliser dans une autre fonction de cette meme classe ?
Oui, mais tu dois mettre le template sur la classe et non pas sur la fonction:
template<typename T> class MaClasse { public: void maFonction(T* maVariable); };
int main() { MaClasse<int> mc; int i = 2; mc.maFonction(&i); }
A l'intérieur de cette fonction le type "type" est utilisable.
Peut-on le sauvegarder au sein de la classe pour pouvoir l'utiliser dans une
autre fonction de cette meme classe ?
Oui, mais tu dois mettre le template sur la classe et non pas sur
la fonction:
template<typename T>
class MaClasse {
public:
void maFonction(T* maVariable);
};
int main() {
MaClasse<int> mc;
int i = 2;
mc.maFonction(&i);
}
A l'intérieur de cette fonction le type "type" est utilisable. Peut-on le sauvegarder au sein de la classe pour pouvoir l'utiliser dans une autre fonction de cette meme classe ?
Oui, mais tu dois mettre le template sur la classe et non pas sur la fonction:
template<typename T> class MaClasse { public: void maFonction(T* maVariable); };
int main() { MaClasse<int> mc; int i = 2; mc.maFonction(&i); }
Qu'est-ce que tu entends par sauvegarder ? Et quelle utilisation veux-tu en faire dans ton autre fonction ?
Toujours mon histoire de callback. Si je ne peux pas passer une fonction membre, je passe l'objet, mais il peut avoir plusieur type différent : [...]
Bien evidement, chaque classe qui desire que la class CallBack les appelle doivent avoir toute la fonction membre FonctionCallBack().
Alors la solution est d'utiliser des objets foncteurs. regarde du côté de boost par exemple : http://www.boost.org/doc/html/function.html
Recherche un peu sur google aussi, tu trouveras de nombreux cours/tutoriels dessus (en anglais c'est 'functor').
Sinon voir la solution d'André.
A+
Christophe
-- Christophe de Vienne
Falk Tannhäuser
PurL wrote:
Toujours mon histoire de callback. Si je ne peux pas passer une fonction membre, je passe l'objet, mais il peut avoir plusieur type différent :
class CallBack { template <class type> void fct(type *frm); type *m_frm; void AutreFonction(); };
template <class type> void CallBack::fct(type *frm) { //je sauvegarde frm dans une variable membre, mais cette //variable doit etre du meme type que frm m_frm = frm; }
void CallBack::AutreFonction() { //ici je voudais faire : m_frm->FonctionCallBack(); }
Bien evidement, chaque classe qui desire que la class CallBack les appelle doivent avoir toute la fonction membre FonctionCallBack().
Tu veux peut-être quelque chose du genre : _____________________________________________________________________________ #include <cassert>
class CallBack { class ClientBase { public: virtual void call_back() = 0; virtual ~ClientBase() {} };
template<typename T> class Client: public ClientBase { T the_client; public: Client(T const& cl) : the_client(cl) {} void call_back() { the_client.FonctionCallBack(); } };
Il est à noter que les classes de test 'foo', 'bar' et toto n'ont pas besoin d'avoir des relations d'héritage (ancêtre commun ...) entre elles, tout ce qu'il leur faut est la fonction membre 'void FonctionCallBack()'. Il faut voir s'il faut faire des copies des objets passés à 'ClientBase::Enregistrer' comme je l'ai fait (cela évite des ennuis dûs à la durée de vie des objets) ou s'il suffit de stocker des pointeurs comme toi tu comptais faire dans le bout de code posté (prudence alors !)
Falk
PurL wrote:
Toujours mon histoire de callback.
Si je ne peux pas passer une fonction membre, je passe l'objet, mais il peut
avoir plusieur type différent :
class CallBack
{
template <class type> void fct(type *frm);
type *m_frm;
void AutreFonction();
};
template <class type> void CallBack::fct(type *frm)
{
//je sauvegarde frm dans une variable membre, mais cette
//variable doit etre du meme type que frm
m_frm = frm;
}
void CallBack::AutreFonction()
{
//ici je voudais faire :
m_frm->FonctionCallBack();
}
Bien evidement, chaque classe qui desire que la class CallBack les appelle
doivent avoir toute la fonction membre FonctionCallBack().
Tu veux peut-être quelque chose du genre :
_____________________________________________________________________________
#include <cassert>
class CallBack
{
class ClientBase
{
public:
virtual void call_back() = 0;
virtual ~ClientBase() {}
};
template<typename T> class Client: public ClientBase
{
T the_client;
public:
Client(T const& cl) : the_client(cl) {}
void call_back() { the_client.FonctionCallBack(); }
};
Il est à noter que les classes de test 'foo', 'bar' et toto n'ont pas besoin
d'avoir des relations d'héritage (ancêtre commun ...) entre elles, tout ce
qu'il leur faut est la fonction membre 'void FonctionCallBack()'.
Il faut voir s'il faut faire des copies des objets passés à
'ClientBase::Enregistrer' comme je l'ai fait (cela évite des ennuis dûs à
la durée de vie des objets) ou s'il suffit de stocker des pointeurs
comme toi tu comptais faire dans le bout de code posté (prudence alors !)
Toujours mon histoire de callback. Si je ne peux pas passer une fonction membre, je passe l'objet, mais il peut avoir plusieur type différent :
class CallBack { template <class type> void fct(type *frm); type *m_frm; void AutreFonction(); };
template <class type> void CallBack::fct(type *frm) { //je sauvegarde frm dans une variable membre, mais cette //variable doit etre du meme type que frm m_frm = frm; }
void CallBack::AutreFonction() { //ici je voudais faire : m_frm->FonctionCallBack(); }
Bien evidement, chaque classe qui desire que la class CallBack les appelle doivent avoir toute la fonction membre FonctionCallBack().
Tu veux peut-être quelque chose du genre : _____________________________________________________________________________ #include <cassert>
class CallBack { class ClientBase { public: virtual void call_back() = 0; virtual ~ClientBase() {} };
template<typename T> class Client: public ClientBase { T the_client; public: Client(T const& cl) : the_client(cl) {} void call_back() { the_client.FonctionCallBack(); } };
Il est à noter que les classes de test 'foo', 'bar' et toto n'ont pas besoin d'avoir des relations d'héritage (ancêtre commun ...) entre elles, tout ce qu'il leur faut est la fonction membre 'void FonctionCallBack()'. Il faut voir s'il faut faire des copies des objets passés à 'ClientBase::Enregistrer' comme je l'ai fait (cela évite des ennuis dûs à la durée de vie des objets) ou s'il suffit de stocker des pointeurs comme toi tu comptais faire dans le bout de code posté (prudence alors !)
Falk
Falk Tannhäuser
Falk Tannhäuser wrote:
Il est à noter que les classes de test 'foo', 'bar' et toto n'ont pas besoin d'avoir des relations d'héritage (ancêtre commun ...) entre elles, tout ce qu'il leur faut est la fonction membre 'void FonctionCallBack()'.
Même cette restriction peut être levée moyennant une petite modif de la classe 'Client' imbriquée dans 'CallBack' :
template<typename T> class Client: public ClientBase { T the_client; void (T::* mem_fun)(); public: Client(T const& cl, void (T::* mf)()) : the_client(cl), mem_fun(mf) {} void call_back() { (the_client.*mem_fun)(); } };
puis on passe le pointeur sur la fonction membre souhaitée dans 'CallBack::Enregistrer' qui est complétée comme suit :
Il est à noter que les classes de test 'foo', 'bar' et toto n'ont pas
besoin d'avoir des relations d'héritage (ancêtre commun ...) entre elles,
tout ce qu'il leur faut est la fonction membre 'void FonctionCallBack()'.
Même cette restriction peut être levée moyennant une petite modif
de la classe 'Client' imbriquée dans 'CallBack' :
template<typename T> class Client: public ClientBase
{
T the_client;
void (T::* mem_fun)();
public:
Client(T const& cl, void (T::* mf)()) : the_client(cl), mem_fun(mf) {}
void call_back() { (the_client.*mem_fun)(); }
};
puis on passe le pointeur sur la fonction membre souhaitée dans
'CallBack::Enregistrer' qui est complétée comme suit :
Il est à noter que les classes de test 'foo', 'bar' et toto n'ont pas besoin d'avoir des relations d'héritage (ancêtre commun ...) entre elles, tout ce qu'il leur faut est la fonction membre 'void FonctionCallBack()'.
Même cette restriction peut être levée moyennant une petite modif de la classe 'Client' imbriquée dans 'CallBack' :
template<typename T> class Client: public ClientBase { T the_client; void (T::* mem_fun)(); public: Client(T const& cl, void (T::* mf)()) : the_client(cl), mem_fun(mf) {} void call_back() { (the_client.*mem_fun)(); } };
puis on passe le pointeur sur la fonction membre souhaitée dans 'CallBack::Enregistrer' qui est complétée comme suit :