Salut à tous,
dans une de mes classes, j'ai besoin de stocker l'adresse d'une
fonction membre d'une autre classe. Sachant que les deux
classes en question ne se connaissent pas (et c'est important),
je souhaiterais naturellement écrire un truc du genre :
Class A {
private :
double& GetA() { return m_A; }
double m_A;
}
Class B {
public:
B(double&(*f)(void)) { GetA = f; } //
Constructeur private :
double&(*GetA)(void);
}
Mais ce code ne compile pas. Je n'ai apparamment pas le droit
d'écrire un tel truc. Je ne comprends pas pourquoi.
Salut à tous,
dans une de mes classes, j'ai besoin de stocker l'adresse d'une
fonction membre d'une autre classe. Sachant que les deux
classes en question ne se connaissent pas (et c'est important),
je souhaiterais naturellement écrire un truc du genre :
Class A {
private :
double& GetA() { return m_A; }
double m_A;
}
Class B {
public:
B(double&(*f)(void)) { GetA = f; } //
Constructeur private :
double&(*GetA)(void);
}
Mais ce code ne compile pas. Je n'ai apparamment pas le droit
d'écrire un tel truc. Je ne comprends pas pourquoi.
Salut à tous,
dans une de mes classes, j'ai besoin de stocker l'adresse d'une
fonction membre d'une autre classe. Sachant que les deux
classes en question ne se connaissent pas (et c'est important),
je souhaiterais naturellement écrire un truc du genre :
Class A {
private :
double& GetA() { return m_A; }
double m_A;
}
Class B {
public:
B(double&(*f)(void)) { GetA = f; } //
Constructeur private :
double&(*GetA)(void);
}
Mais ce code ne compile pas. Je n'ai apparamment pas le droit
d'écrire un tel truc. Je ne comprends pas pourquoi.
Un pointeur sur une fonction membre, ce n'est pas la même chose
qu'un pointeur sur une fonction. Tu ne peux pas garder l'un
dans une variable pour l'autre. Si les deux classes ne se
connaissent pas, je ne vois pas comment tu pourras faire parce
que pour déclarer le pointeur sur une fonction, il faut avoir
son type et il dépend de la classe...
Un pointeur sur une fonction membre, ce n'est pas la même chose
qu'un pointeur sur une fonction. Tu ne peux pas garder l'un
dans une variable pour l'autre. Si les deux classes ne se
connaissent pas, je ne vois pas comment tu pourras faire parce
que pour déclarer le pointeur sur une fonction, il faut avoir
son type et il dépend de la classe...
Un pointeur sur une fonction membre, ce n'est pas la même chose
qu'un pointeur sur une fonction. Tu ne peux pas garder l'un
dans une variable pour l'autre. Si les deux classes ne se
connaissent pas, je ne vois pas comment tu pourras faire parce
que pour déclarer le pointeur sur une fonction, il faut avoir
son type et il dépend de la classe...
Salut à tous,
dans une de mes classes, j'ai besoin de stocker l'adresse d'une fonction
membre d'une autre classe. Sachant que les deux classes en question ne se
connaissent pas (et c'est important), je souhaiterais naturellement écrire
un truc du genre :
[...]
Mais ce code ne compile pas. Je n'ai apparamment pas le droit d'écrire un
tel truc. Je ne comprends pas pourquoi.
Quelqu'un pourrait-il m'expliquer ce qui ne va pas, et comment y palier ?
Salut à tous,
dans une de mes classes, j'ai besoin de stocker l'adresse d'une fonction
membre d'une autre classe. Sachant que les deux classes en question ne se
connaissent pas (et c'est important), je souhaiterais naturellement écrire
un truc du genre :
[...]
Mais ce code ne compile pas. Je n'ai apparamment pas le droit d'écrire un
tel truc. Je ne comprends pas pourquoi.
Quelqu'un pourrait-il m'expliquer ce qui ne va pas, et comment y palier ?
Salut à tous,
dans une de mes classes, j'ai besoin de stocker l'adresse d'une fonction
membre d'une autre classe. Sachant que les deux classes en question ne se
connaissent pas (et c'est important), je souhaiterais naturellement écrire
un truc du genre :
[...]
Mais ce code ne compile pas. Je n'ai apparamment pas le droit d'écrire un
tel truc. Je ne comprends pas pourquoi.
Quelqu'un pourrait-il m'expliquer ce qui ne va pas, et comment y palier ?
Je vois bien comment
recevoir le pointeur (avec une fonction template)
Je vois bien comment
recevoir le pointeur (avec une fonction template)
Je vois bien comment
recevoir le pointeur (avec une fonction template)
class A {
public:
A(double d) : d_(d) {}
double& get() { return d_; }
private:
double d_;
};
typedef double& (A::*GetDouble)();
class B {
public:
B(GetDouble gd) : gd_(gd) {}
GetDouble GetDoubleProc() { return gd_; }
private:
GetDouble gd_;
};
int main() {
A a1(3.14);
A a2(0.);
B b(&A::get);
GetDouble gd = b.GetDoubleProc();
std::cout << (a1.*gd)() << std::endl << (a2.*gd)() << std::endl;
return 0;
}
$ g++ b.cpp && a
3.14
0
En esperant que ca te fasse avancer...
class A {
public:
A(double d) : d_(d) {}
double& get() { return d_; }
private:
double d_;
};
typedef double& (A::*GetDouble)();
class B {
public:
B(GetDouble gd) : gd_(gd) {}
GetDouble GetDoubleProc() { return gd_; }
private:
GetDouble gd_;
};
int main() {
A a1(3.14);
A a2(0.);
B b(&A::get);
GetDouble gd = b.GetDoubleProc();
std::cout << (a1.*gd)() << std::endl << (a2.*gd)() << std::endl;
return 0;
}
$ g++ b.cpp && a
3.14
0
En esperant que ca te fasse avancer...
class A {
public:
A(double d) : d_(d) {}
double& get() { return d_; }
private:
double d_;
};
typedef double& (A::*GetDouble)();
class B {
public:
B(GetDouble gd) : gd_(gd) {}
GetDouble GetDoubleProc() { return gd_; }
private:
GetDouble gd_;
};
int main() {
A a1(3.14);
A a2(0.);
B b(&A::get);
GetDouble gd = b.GetDoubleProc();
std::cout << (a1.*gd)() << std::endl << (a2.*gd)() << std::endl;
return 0;
}
$ g++ b.cpp && a
3.14
0
En esperant que ca te fasse avancer...
Je vois bien comment
recevoir le pointeur (avec une fonction template)
Mais si B ne connait pas A à la compilation ? Je ne suis pas
certain de voir exactement ce à quoi tu penses. Peux-tu être plus
précis, s'il te plaît ?
Je vois bien comment
recevoir le pointeur (avec une fonction template)
Mais si B ne connait pas A à la compilation ? Je ne suis pas
certain de voir exactement ce à quoi tu penses. Peux-tu être plus
précis, s'il te plaît ?
Je vois bien comment
recevoir le pointeur (avec une fonction template)
Mais si B ne connait pas A à la compilation ? Je ne suis pas
certain de voir exactement ce à quoi tu penses. Peux-tu être plus
précis, s'il te plaît ?
Je vois bien comment
recevoir le pointeur (avec une fonction template)
Mais si B ne connait pas A à la compilation ? Je ne suis pas
certain de voir exactement ce à quoi tu penses. Peux-tu être plus
précis, s'il te plaît ?
En fait, vous avez raison, j'ai trop simplifié mon exemple : A connaît B,
mais B ne connaît pas A.
Pour être plus précis, B est un itérateur de A :
Class MyVector { // la classe A
public:
MyIterator begin() { return MyIterator(0, &GetValue); }
^^^^^^^^^^^^
double& operator [] (int i) { return GetValue(i); }
private :
double& GetValue(int i) { return UN_DOUBLE; }
vector<double>* m_pMyTab;
}
Class MyIterator { // la classe B
public:
MyIterator (double&(*f)(void)) { ref = f; } //
^^^^
Constructeur
double & operator * ( return ref(m_Current); } //
^^^^^^^^
Appelle en fait MyVector::GetValue(m_Current)
MyIterator& operator ++ () { m_Current++; return *this; }
private :
double&(*ref)(void);
^^^^
int m_Current;
}
Là encore, j'ai simplifié. Mais il est clair que MyIterator ne peut pas
connaître MyVector.
class MyIterator
La fonction MyVector::GetValue(int i) renvoie un élément du tableau m_pMyTab
mais pas nécessairement le i-ème. C'est bien sûr pour cette raison que le
tout est si compliqué : je suis obligé de créer mon propre itérateur pour
tenir compte de cet index variable.
Par exemple, cela peut être :
double& GetValue(int i) {
return (*m_pMyTab)[random(m_pMyTab->size()-1];
}
Où random(int i) retourne un nombre choisi aléatoirement entre 0 et i.
J'aurais dû, alors, écrire directement la fonction GetValue dans la classe
itérateur MyIterator. Mais dans ce cas, je n'aurais pas pu en bénéficier
lors de la surcharge de [] dans la classe MyVector.
Est-ce plus clair ?
Merci.
Je vois bien comment
recevoir le pointeur (avec une fonction template)
Mais si B ne connait pas A à la compilation ? Je ne suis pas
certain de voir exactement ce à quoi tu penses. Peux-tu être plus
précis, s'il te plaît ?
En fait, vous avez raison, j'ai trop simplifié mon exemple : A connaît B,
mais B ne connaît pas A.
Pour être plus précis, B est un itérateur de A :
Class MyVector { // la classe A
public:
MyIterator begin() { return MyIterator(0, &GetValue); }
^^^^^^^^^^^^
double& operator [] (int i) { return GetValue(i); }
private :
double& GetValue(int i) { return UN_DOUBLE; }
vector<double>* m_pMyTab;
}
Class MyIterator { // la classe B
public:
MyIterator (double&(*f)(void)) { ref = f; } //
^^^^
Constructeur
double & operator * ( return ref(m_Current); } //
^^^^^^^^
Appelle en fait MyVector::GetValue(m_Current)
MyIterator& operator ++ () { m_Current++; return *this; }
private :
double&(*ref)(void);
^^^^
int m_Current;
}
Là encore, j'ai simplifié. Mais il est clair que MyIterator ne peut pas
connaître MyVector.
class MyIterator
La fonction MyVector::GetValue(int i) renvoie un élément du tableau m_pMyTab
mais pas nécessairement le i-ème. C'est bien sûr pour cette raison que le
tout est si compliqué : je suis obligé de créer mon propre itérateur pour
tenir compte de cet index variable.
Par exemple, cela peut être :
double& GetValue(int i) {
return (*m_pMyTab)[random(m_pMyTab->size()-1];
}
Où random(int i) retourne un nombre choisi aléatoirement entre 0 et i.
J'aurais dû, alors, écrire directement la fonction GetValue dans la classe
itérateur MyIterator. Mais dans ce cas, je n'aurais pas pu en bénéficier
lors de la surcharge de [] dans la classe MyVector.
Est-ce plus clair ?
Merci.
Je vois bien comment
recevoir le pointeur (avec une fonction template)
Mais si B ne connait pas A à la compilation ? Je ne suis pas
certain de voir exactement ce à quoi tu penses. Peux-tu être plus
précis, s'il te plaît ?
En fait, vous avez raison, j'ai trop simplifié mon exemple : A connaît B,
mais B ne connaît pas A.
Pour être plus précis, B est un itérateur de A :
Class MyVector { // la classe A
public:
MyIterator begin() { return MyIterator(0, &GetValue); }
^^^^^^^^^^^^
double& operator [] (int i) { return GetValue(i); }
private :
double& GetValue(int i) { return UN_DOUBLE; }
vector<double>* m_pMyTab;
}
Class MyIterator { // la classe B
public:
MyIterator (double&(*f)(void)) { ref = f; } //
^^^^
Constructeur
double & operator * ( return ref(m_Current); } //
^^^^^^^^
Appelle en fait MyVector::GetValue(m_Current)
MyIterator& operator ++ () { m_Current++; return *this; }
private :
double&(*ref)(void);
^^^^
int m_Current;
}
Là encore, j'ai simplifié. Mais il est clair que MyIterator ne peut pas
connaître MyVector.
class MyIterator
La fonction MyVector::GetValue(int i) renvoie un élément du tableau m_pMyTab
mais pas nécessairement le i-ème. C'est bien sûr pour cette raison que le
tout est si compliqué : je suis obligé de créer mon propre itérateur pour
tenir compte de cet index variable.
Par exemple, cela peut être :
double& GetValue(int i) {
return (*m_pMyTab)[random(m_pMyTab->size()-1];
}
Où random(int i) retourne un nombre choisi aléatoirement entre 0 et i.
J'aurais dû, alors, écrire directement la fonction GetValue dans la classe
itérateur MyIterator. Mais dans ce cas, je n'aurais pas pu en bénéficier
lors de la surcharge de [] dans la classe MyVector.
Est-ce plus clair ?
Merci.
Quelque chose m'a échappé ... Notamment
la non visibilité du type de conteneur par l'itérateur.
Quelque chose m'a échappé ... Notamment
la non visibilité du type de conteneur par l'itérateur.
Quelque chose m'a échappé ... Notamment
la non visibilité du type de conteneur par l'itérateur.
Ta réponse me convient parfaitement. Je te remercie d'avoir passé du temps à
la rédiger, c'est vraiment très aimable de ta part.
En ce qui me concerne, ça me semble compliqué, mais je vais bien sûr le
tester.
Quelque chose m'a échappé ... Notamment
la non visibilité du type de conteneur par l'itérateur.
A cause des références (#include) croisées
Juste une petite question, puisque tu sembles calé : as-tu déjà implémenté
une classe matrice en vue de calculs mathématiques performants ? Et dans ce
cas, si ce n'est pas trop long à décrire, quelle architecture Vector/Matrix
as-tu choisi ?
Je te remercie encore de tes réponses :-))
Bon dimanche.
Ta réponse me convient parfaitement. Je te remercie d'avoir passé du temps à
la rédiger, c'est vraiment très aimable de ta part.
En ce qui me concerne, ça me semble compliqué, mais je vais bien sûr le
tester.
Quelque chose m'a échappé ... Notamment
la non visibilité du type de conteneur par l'itérateur.
A cause des références (#include) croisées
Juste une petite question, puisque tu sembles calé : as-tu déjà implémenté
une classe matrice en vue de calculs mathématiques performants ? Et dans ce
cas, si ce n'est pas trop long à décrire, quelle architecture Vector/Matrix
as-tu choisi ?
Je te remercie encore de tes réponses :-))
Bon dimanche.
Ta réponse me convient parfaitement. Je te remercie d'avoir passé du temps à
la rédiger, c'est vraiment très aimable de ta part.
En ce qui me concerne, ça me semble compliqué, mais je vais bien sûr le
tester.
Quelque chose m'a échappé ... Notamment
la non visibilité du type de conteneur par l'itérateur.
A cause des références (#include) croisées
Juste une petite question, puisque tu sembles calé : as-tu déjà implémenté
une classe matrice en vue de calculs mathématiques performants ? Et dans ce
cas, si ce n'est pas trop long à décrire, quelle architecture Vector/Matrix
as-tu choisi ?
Je te remercie encore de tes réponses :-))
Bon dimanche.