Bon, en m'aidant un peu de google, j'ai trouvé la syntaxe pour appeler les
pointeurs de méthode. Ca compile, par contre, je ne garantis pas que ça
marche :)
Bon, en m'aidant un peu de google, j'ai trouvé la syntaxe pour appeler les
pointeurs de méthode. Ca compile, par contre, je ne garantis pas que ça
marche :)
Bon, en m'aidant un peu de google, j'ai trouvé la syntaxe pour appeler les
pointeurs de méthode. Ca compile, par contre, je ne garantis pas que ça
marche :)
Je définis une classe qui me permet de générer des formes
d'ondes (extraits code en fin de message(toutes critiques
bienvenues ;-) )) Dans cette classe, j'ai quelques fonctions,
de type
void F0 (double);
Je veux faire un tableau de pointeurs de fonctions mais je
rencontre quelques difficultés.
J'essaie de faire un
typedef void (*fptronde) (double);
puis je fais des
fonction[0]=&onde::F0;
Mais ça ne compile pas... error C2440: '=' : impossible de
convertir de 'void (__thiscall onde::* )(double)' en
'onde::fptronde'
Allors 3 questions:
comment dois-je définir mon type de pointeur sur fonction???
suis-je obligé de passer par un type que je n'utilise qu'une
fois?
Les données étant dupliquées pour chaque instance de la
classe, que dois-je faire pour n'avoir qu'une instance de ce
pointeur de fonction?
class onde
{
private:
double Amp, *PAmp, Freq, *PFreq, Deph, *PDeph, Off, *POff; //Amplitu de
Frequence déphasage offset (numériques fixes) et pointeurs associés.
typedef void (*fptronde) (double);
fptronde fonction [5];
void sinusoide(double);
void carree (double);
void triangulaire (double);
void montante (double);
void descendante (double);
public:
int type; //type de générateur d'onde
double sortie;
bool zero;
onde();
double CalcSortie(double);
void SetAmplitude(double);
void LieAmplitude(double&);
void SetFrequence(double);
void LieFrequence(double&);
void SetDephasage(double);
void LieDephasage(double&);
void SetOffset(double);
void LieOffset(double&);
};
void onde::sinusoide(double t)
{
sortie= *PAmp * sin( *PFreq * t + *PDeph ) + *POff;
}
(...)
onde::onde()
{
Amp=FreqÞph=Off=0;
PAmp=&Amp;
PFreq=&Freq;
PDeph=&Deph;
POff=&Off;
type=0;
fonction[0]=&onde::sinusoide;
fonction[1]=&onde::carree;
fonction[2]=&onde::triangulaire;
fonction[3]=&onde::montante;
fonction[4]=&onde::descendante;
}
double onde::CalcSortie(double t)
{
double temp=*PFreq * t;
(*(fonction[type]))(t);
}
void onde::SetAmplitude(double A)
{
Amp=A;
PAmp=&Amp;
}
void onde::LieAmplitude(double &A)
{
PAmp=&A;
}
(...)
Je définis une classe qui me permet de générer des formes
d'ondes (extraits code en fin de message(toutes critiques
bienvenues ;-) )) Dans cette classe, j'ai quelques fonctions,
de type
void F0 (double);
Je veux faire un tableau de pointeurs de fonctions mais je
rencontre quelques difficultés.
J'essaie de faire un
typedef void (*fptronde) (double);
puis je fais des
fonction[0]=&onde::F0;
Mais ça ne compile pas... error C2440: '=' : impossible de
convertir de 'void (__thiscall onde::* )(double)' en
'onde::fptronde'
Allors 3 questions:
comment dois-je définir mon type de pointeur sur fonction???
suis-je obligé de passer par un type que je n'utilise qu'une
fois?
Les données étant dupliquées pour chaque instance de la
classe, que dois-je faire pour n'avoir qu'une instance de ce
pointeur de fonction?
class onde
{
private:
double Amp, *PAmp, Freq, *PFreq, Deph, *PDeph, Off, *POff; //Amplitu de
Frequence déphasage offset (numériques fixes) et pointeurs associés.
typedef void (*fptronde) (double);
fptronde fonction [5];
void sinusoide(double);
void carree (double);
void triangulaire (double);
void montante (double);
void descendante (double);
public:
int type; //type de générateur d'onde
double sortie;
bool zero;
onde();
double CalcSortie(double);
void SetAmplitude(double);
void LieAmplitude(double&);
void SetFrequence(double);
void LieFrequence(double&);
void SetDephasage(double);
void LieDephasage(double&);
void SetOffset(double);
void LieOffset(double&);
};
void onde::sinusoide(double t)
{
sortie= *PAmp * sin( *PFreq * t + *PDeph ) + *POff;
}
(...)
onde::onde()
{
Amp=Freq=Deph=Off=0;
PAmp=&Amp;
PFreq=&Freq;
PDeph=&Deph;
POff=&Off;
type=0;
fonction[0]=&onde::sinusoide;
fonction[1]=&onde::carree;
fonction[2]=&onde::triangulaire;
fonction[3]=&onde::montante;
fonction[4]=&onde::descendante;
}
double onde::CalcSortie(double t)
{
double temp=*PFreq * t;
(*(fonction[type]))(t);
}
void onde::SetAmplitude(double A)
{
Amp=A;
PAmp=&Amp;
}
void onde::LieAmplitude(double &A)
{
PAmp=&A;
}
(...)
Je définis une classe qui me permet de générer des formes
d'ondes (extraits code en fin de message(toutes critiques
bienvenues ;-) )) Dans cette classe, j'ai quelques fonctions,
de type
void F0 (double);
Je veux faire un tableau de pointeurs de fonctions mais je
rencontre quelques difficultés.
J'essaie de faire un
typedef void (*fptronde) (double);
puis je fais des
fonction[0]=&onde::F0;
Mais ça ne compile pas... error C2440: '=' : impossible de
convertir de 'void (__thiscall onde::* )(double)' en
'onde::fptronde'
Allors 3 questions:
comment dois-je définir mon type de pointeur sur fonction???
suis-je obligé de passer par un type que je n'utilise qu'une
fois?
Les données étant dupliquées pour chaque instance de la
classe, que dois-je faire pour n'avoir qu'une instance de ce
pointeur de fonction?
class onde
{
private:
double Amp, *PAmp, Freq, *PFreq, Deph, *PDeph, Off, *POff; //Amplitu de
Frequence déphasage offset (numériques fixes) et pointeurs associés.
typedef void (*fptronde) (double);
fptronde fonction [5];
void sinusoide(double);
void carree (double);
void triangulaire (double);
void montante (double);
void descendante (double);
public:
int type; //type de générateur d'onde
double sortie;
bool zero;
onde();
double CalcSortie(double);
void SetAmplitude(double);
void LieAmplitude(double&);
void SetFrequence(double);
void LieFrequence(double&);
void SetDephasage(double);
void LieDephasage(double&);
void SetOffset(double);
void LieOffset(double&);
};
void onde::sinusoide(double t)
{
sortie= *PAmp * sin( *PFreq * t + *PDeph ) + *POff;
}
(...)
onde::onde()
{
Amp=FreqÞph=Off=0;
PAmp=&Amp;
PFreq=&Freq;
PDeph=&Deph;
POff=&Off;
type=0;
fonction[0]=&onde::sinusoide;
fonction[1]=&onde::carree;
fonction[2]=&onde::triangulaire;
fonction[3]=&onde::montante;
fonction[4]=&onde::descendante;
}
double onde::CalcSortie(double t)
{
double temp=*PFreq * t;
(*(fonction[type]))(t);
}
void onde::SetAmplitude(double A)
{
Amp=A;
PAmp=&Amp;
}
void onde::LieAmplitude(double &A)
{
PAmp=&A;
}
(...)
On Thu, 22 Sep 2005 21:34:03 +0200, "cyrcocq" :Donc si je comprends bien (Stan et Fabien) l'approche tableau
de pointeur de fonction est a remplacer par une approche de
foncteur.
Oui. En rappelant que le type canonique pour un tableau en C++
est std::vector<>.
On Thu, 22 Sep 2005 21:34:03 +0200, "cyrcocq" <cyrcocq@...>:
Donc si je comprends bien (Stan et Fabien) l'approche tableau
de pointeur de fonction est a remplacer par une approche de
foncteur.
Oui. En rappelant que le type canonique pour un tableau en C++
est std::vector<>.
On Thu, 22 Sep 2005 21:34:03 +0200, "cyrcocq" :Donc si je comprends bien (Stan et Fabien) l'approche tableau
de pointeur de fonction est a remplacer par une approche de
foncteur.
Oui. En rappelant que le type canonique pour un tableau en C++
est std::vector<>.
On Thu, 22 Sep 2005 13:41:25 +0200, "cyrcocq" :fptronde fonction [5];
Et un jour, tu ajouteras une fonction, et, ne te souvenant
plus de la signification (ou de l'existence) de ce "5", tu ne
le modifieras pas... et boum !
Je corrige donc cette faute de frappe :
std::vector <fptronde> fonction;
Autre souci : indexer ton tableau avec des entiers ne me
paraît pas adéquat. Que diable le "3" de "fonction[3]" ou de
"type=3" peut-il bien signifier ?
Il vaudrait mieux créer un type "Index", et mettre tes
fonctions dans un std::map<Index,type_fonction>.
Si c'est la logique interne du programme qui choisit la fonction,
Index sera un enum :
enum Index { FCT_carre, FCT_sinus, ... };
Si c'est l'utilisateur qui choisit la fonction, l'index pourra
être le texte affiché dans le menu, pour éviter les
intermédiaires :
On Thu, 22 Sep 2005 13:41:25 +0200, "cyrcocq" <cyrcocq@...>:
fptronde fonction [5];
Et un jour, tu ajouteras une fonction, et, ne te souvenant
plus de la signification (ou de l'existence) de ce "5", tu ne
le modifieras pas... et boum !
Je corrige donc cette faute de frappe :
std::vector <fptronde> fonction;
Autre souci : indexer ton tableau avec des entiers ne me
paraît pas adéquat. Que diable le "3" de "fonction[3]" ou de
"type=3" peut-il bien signifier ?
Il vaudrait mieux créer un type "Index", et mettre tes
fonctions dans un std::map<Index,type_fonction>.
Si c'est la logique interne du programme qui choisit la fonction,
Index sera un enum :
enum Index { FCT_carre, FCT_sinus, ... };
Si c'est l'utilisateur qui choisit la fonction, l'index pourra
être le texte affiché dans le menu, pour éviter les
intermédiaires :
On Thu, 22 Sep 2005 13:41:25 +0200, "cyrcocq" :fptronde fonction [5];
Et un jour, tu ajouteras une fonction, et, ne te souvenant
plus de la signification (ou de l'existence) de ce "5", tu ne
le modifieras pas... et boum !
Je corrige donc cette faute de frappe :
std::vector <fptronde> fonction;
Autre souci : indexer ton tableau avec des entiers ne me
paraît pas adéquat. Que diable le "3" de "fonction[3]" ou de
"type=3" peut-il bien signifier ?
Il vaudrait mieux créer un type "Index", et mettre tes
fonctions dans un std::map<Index,type_fonction>.
Si c'est la logique interne du programme qui choisit la fonction,
Index sera un enum :
enum Index { FCT_carre, FCT_sinus, ... };
Si c'est l'utilisateur qui choisit la fonction, l'index pourra
être le texte affiché dans le menu, pour éviter les
intermédiaires :
"Fabien LE LEZ" a écrit dans le
message de news:std::vector <fptronde> fonction;
Bon, je vois... ici ca rigole pas ;-)
Non, c'est chouette d'apprendre à faire et aussi d'apprendre à
faire corectement, mais j'avoue que là j'ai un peu peur de pas
tout maîtriser.
Faut dire que je débute l'aspect objet, je ne sais pas si je
peux déjà dire que j'ai commencé la librairie standard... J'ai
l'impression de devoir tout apprendre d'un bloc. Bref beaucoup
de notions à assimiler!
Autre souci : indexer ton tableau avec des entiers ne me
paraît pas adéquat. Que diable le "3" de "fonction[3]" ou de
"type=3" peut-il bien signifier ?
Il vaudrait mieux créer un type "Index", et mettre tes
fonctions dans un std::map<Index,type_fonction>.
Si c'est la logique interne du programme qui choisit la
fonction, Index sera un enum :
enum Index { FCT_carre, FCT_sinus, ... };
Si c'est l'utilisateur qui choisit la fonction, l'index
pourra être le texte affiché dans le menu, pour éviter les
intermédiaires :
typedef std::string Index;
Hmmm... Je vois... ou plutot, je vais réflechir à la question
et je verrais!
typedef void (*fptronde) (double);
comment dois-je définir mon type de pointeur sur fonction???
Comme un foncteur.
J'ai bien l'impression que vous étes d'accord sur cet aspect!
Tant pis pour ma tentative d'assimilation progressive (basée
sur la succession des chapitres du cours de Christian
Casteyde)
Decidemment, c'est frustrant de ne pas avoir trouvé/compris la
méthode pour utliser ce tableau de pointeur de fonction, il
faut quand même que j'y revienne...
typedef void (onde::*fptronde) (double);
// On est d'accord, je définis un type pointeur de fonction de ma classe
onde
static fptronde fonction [5];
// Je déclare un tableau de 5 de ces pointeurs
fonction[0]=&onde::sinusoide;
// J'initialise le premier pointeur de mon tableau
fonction[0] (t);
//Me dit:error C2064: le terme ne correspond pas à une fonction
//Pareil avec onde::fonction[type] (t); ou this->fonction[type] (t); ou
*fonction[0] (t);
"Fabien LE LEZ" <gramster@gramster.com> a écrit dans le
message de news: m8m5j1hceqsthc7ru0plvrfb8qvthjsn6j@4ax.com...
std::vector <fptronde> fonction;
Bon, je vois... ici ca rigole pas ;-)
Non, c'est chouette d'apprendre à faire et aussi d'apprendre à
faire corectement, mais j'avoue que là j'ai un peu peur de pas
tout maîtriser.
Faut dire que je débute l'aspect objet, je ne sais pas si je
peux déjà dire que j'ai commencé la librairie standard... J'ai
l'impression de devoir tout apprendre d'un bloc. Bref beaucoup
de notions à assimiler!
Autre souci : indexer ton tableau avec des entiers ne me
paraît pas adéquat. Que diable le "3" de "fonction[3]" ou de
"type=3" peut-il bien signifier ?
Il vaudrait mieux créer un type "Index", et mettre tes
fonctions dans un std::map<Index,type_fonction>.
Si c'est la logique interne du programme qui choisit la
fonction, Index sera un enum :
enum Index { FCT_carre, FCT_sinus, ... };
Si c'est l'utilisateur qui choisit la fonction, l'index
pourra être le texte affiché dans le menu, pour éviter les
intermédiaires :
typedef std::string Index;
Hmmm... Je vois... ou plutot, je vais réflechir à la question
et je verrais!
typedef void (*fptronde) (double);
comment dois-je définir mon type de pointeur sur fonction???
Comme un foncteur.
J'ai bien l'impression que vous étes d'accord sur cet aspect!
Tant pis pour ma tentative d'assimilation progressive (basée
sur la succession des chapitres du cours de Christian
Casteyde)
Decidemment, c'est frustrant de ne pas avoir trouvé/compris la
méthode pour utliser ce tableau de pointeur de fonction, il
faut quand même que j'y revienne...
typedef void (onde::*fptronde) (double);
// On est d'accord, je définis un type pointeur de fonction de ma classe
onde
static fptronde fonction [5];
// Je déclare un tableau de 5 de ces pointeurs
fonction[0]=&onde::sinusoide;
// J'initialise le premier pointeur de mon tableau
fonction[0] (t);
//Me dit:error C2064: le terme ne correspond pas à une fonction
//Pareil avec onde::fonction[type] (t); ou this->fonction[type] (t); ou
*fonction[0] (t);
"Fabien LE LEZ" a écrit dans le
message de news:std::vector <fptronde> fonction;
Bon, je vois... ici ca rigole pas ;-)
Non, c'est chouette d'apprendre à faire et aussi d'apprendre à
faire corectement, mais j'avoue que là j'ai un peu peur de pas
tout maîtriser.
Faut dire que je débute l'aspect objet, je ne sais pas si je
peux déjà dire que j'ai commencé la librairie standard... J'ai
l'impression de devoir tout apprendre d'un bloc. Bref beaucoup
de notions à assimiler!
Autre souci : indexer ton tableau avec des entiers ne me
paraît pas adéquat. Que diable le "3" de "fonction[3]" ou de
"type=3" peut-il bien signifier ?
Il vaudrait mieux créer un type "Index", et mettre tes
fonctions dans un std::map<Index,type_fonction>.
Si c'est la logique interne du programme qui choisit la
fonction, Index sera un enum :
enum Index { FCT_carre, FCT_sinus, ... };
Si c'est l'utilisateur qui choisit la fonction, l'index
pourra être le texte affiché dans le menu, pour éviter les
intermédiaires :
typedef std::string Index;
Hmmm... Je vois... ou plutot, je vais réflechir à la question
et je verrais!
typedef void (*fptronde) (double);
comment dois-je définir mon type de pointeur sur fonction???
Comme un foncteur.
J'ai bien l'impression que vous étes d'accord sur cet aspect!
Tant pis pour ma tentative d'assimilation progressive (basée
sur la succession des chapitres du cours de Christian
Casteyde)
Decidemment, c'est frustrant de ne pas avoir trouvé/compris la
méthode pour utliser ce tableau de pointeur de fonction, il
faut quand même que j'y revienne...
typedef void (onde::*fptronde) (double);
// On est d'accord, je définis un type pointeur de fonction de ma classe
onde
static fptronde fonction [5];
// Je déclare un tableau de 5 de ces pointeurs
fonction[0]=&onde::sinusoide;
// J'initialise le premier pointeur de mon tableau
fonction[0] (t);
//Me dit:error C2064: le terme ne correspond pas à une fonction
//Pareil avec onde::fonction[type] (t); ou this->fonction[type] (t); ou
*fonction[0] (t);
J'ai bien l'impression que vous étes d'accord sur cet aspect!
Pas réelement. Je m'aligne plutôt avec Pascal Pizeine, pour la
J'ai bien l'impression que vous étes d'accord sur cet aspect!
Pas réelement. Je m'aligne plutôt avec Pascal Pizeine, pour la
J'ai bien l'impression que vous étes d'accord sur cet aspect!
Pas réelement. Je m'aligne plutôt avec Pascal Pizeine, pour la
Ça dépend. Si on prend sa première version, comme vas-tu faire
pour initialiser le tableau statique.
Ça dépend. Si on prend sa première version, comme vas-tu faire
pour initialiser le tableau statique.
Ça dépend. Si on prend sa première version, comme vas-tu faire
pour initialiser le tableau statique.
"kanze" a écrit dans le message de news:J'ai bien l'impression que vous étes d'accord sur cet
aspect!
Pas réelement. Je m'aligne plutôt avec Pascal Pizeine, pour la
Avec quoi exactement tu n'est pas d'accord ?
"kanze" <kanze@gabi-soft.fr> a écrit dans le message de news:
1127464283.430088.47580@f14g2000cwb.googlegroups.com...
J'ai bien l'impression que vous étes d'accord sur cet
aspect!
Pas réelement. Je m'aligne plutôt avec Pascal Pizeine, pour la
Avec quoi exactement tu n'est pas d'accord ?
"kanze" a écrit dans le message de news:J'ai bien l'impression que vous étes d'accord sur cet
aspect!
Pas réelement. Je m'aligne plutôt avec Pascal Pizeine, pour la
Avec quoi exactement tu n'est pas d'accord ?
std::vector <fptronde> fonction;
Bon, je vois... ici ca rigole pas ;-)
C'est une réaction « knee jerk ».
class onde
{
[...]
fptronde fonction [5];
std::vector <fptronde> fonction;
Bon, je vois... ici ca rigole pas ;-)
C'est une réaction « knee jerk ».
class onde
{
[...]
fptronde fonction [5];
std::vector <fptronde> fonction;
Bon, je vois... ici ca rigole pas ;-)
C'est une réaction « knee jerk ».
class onde
{
[...]
fptronde fonction [5];
Non, c'est chouette d'apprendre à faire et aussi d'apprendre à
faire correctement, mais j'avoue que là j'ai un peu peur de pas
tout maîtriser.
Qu'est-ce que tu vas dire de ma solution, alors, avec des
mix-ins ? :-)
la
fonction virtuelle dans la classe de base. (En passant, ça
s'appelle le concept de modèle, ou « template design pattern »
Sauf que par la suite, il a bien dit qu'il n'en voulait qu'une
copie en tout, et non une copie par objet. Et d'après ce qu'il
nous a montré, le tableau pourrait bien être const. Donc :
static fptronde const fonction[] ;
Ceci dit, on pourrait très bien considérer le concept de
stratégie, avec un objet fonctionnel comme délégué. Mais
attention alors au vocabulaire -- ce n'est pas l'objet
fonctionnel de la STL, qui lui, sera copié par valeur, et dont
le type réel est résolu à la compilation.
En fait, tout dépend de la souplesse dont tu as besoin. S'il
faut changer dynamiquement le type de fonction d'un objet
existant, il n'y a que le concept de stratégie -- la délégation
-- qui le permet.
Si le type fonctionnel de l'objet reste
constant, mais il n'est déterminé que lors de la création de
l'objet, le concept de modèle me semble la solution la plus
simple (mais la délégation reste aussi possible). Et enfin, si
on peut permettre de fixer le type fonctionnel lors de la
compilation, on pourrait s'en tirer avec des templates et des
objets fonctionnels à la STL. On perd énormément de souplesse,
mais on gagne nettement en vitesse. (La différence n'est
normalement pas sensible, mais tes fonctions on l'air d'être
bien petites... et du genre qu'on risque de les appeler des
millions de fois.)
En général, les pointeurs à des fonctions membre est considéré
un topique avancé.
double Amp, *PAmp, Freq, *PFreq, Deph, *PDeph, Off, *POff;
//Amplitude
Frequence déphasage offset (numériques fixes) et pointeurs associés.
C'est de très mauvais style de mettre plus d'une définition par
instruction.
Ça fait un moment que
je n'ai pas regardé un livre C++ pour débutants, mais d'après
tout ce que j'entends, "Accelerated C++: Practical Programming
by Example", de Koenig et Moo, serait parmi les meilleurs, sinon
le meilleur.
Non, c'est chouette d'apprendre à faire et aussi d'apprendre à
faire correctement, mais j'avoue que là j'ai un peu peur de pas
tout maîtriser.
Qu'est-ce que tu vas dire de ma solution, alors, avec des
mix-ins ? :-)
la
fonction virtuelle dans la classe de base. (En passant, ça
s'appelle le concept de modèle, ou « template design pattern »
Sauf que par la suite, il a bien dit qu'il n'en voulait qu'une
copie en tout, et non une copie par objet. Et d'après ce qu'il
nous a montré, le tableau pourrait bien être const. Donc :
static fptronde const fonction[] ;
Ceci dit, on pourrait très bien considérer le concept de
stratégie, avec un objet fonctionnel comme délégué. Mais
attention alors au vocabulaire -- ce n'est pas l'objet
fonctionnel de la STL, qui lui, sera copié par valeur, et dont
le type réel est résolu à la compilation.
En fait, tout dépend de la souplesse dont tu as besoin. S'il
faut changer dynamiquement le type de fonction d'un objet
existant, il n'y a que le concept de stratégie -- la délégation
-- qui le permet.
Si le type fonctionnel de l'objet reste
constant, mais il n'est déterminé que lors de la création de
l'objet, le concept de modèle me semble la solution la plus
simple (mais la délégation reste aussi possible). Et enfin, si
on peut permettre de fixer le type fonctionnel lors de la
compilation, on pourrait s'en tirer avec des templates et des
objets fonctionnels à la STL. On perd énormément de souplesse,
mais on gagne nettement en vitesse. (La différence n'est
normalement pas sensible, mais tes fonctions on l'air d'être
bien petites... et du genre qu'on risque de les appeler des
millions de fois.)
En général, les pointeurs à des fonctions membre est considéré
un topique avancé.
double Amp, *PAmp, Freq, *PFreq, Deph, *PDeph, Off, *POff;
//Amplitude
Frequence déphasage offset (numériques fixes) et pointeurs associés.
C'est de très mauvais style de mettre plus d'une définition par
instruction.
Ça fait un moment que
je n'ai pas regardé un livre C++ pour débutants, mais d'après
tout ce que j'entends, "Accelerated C++: Practical Programming
by Example", de Koenig et Moo, serait parmi les meilleurs, sinon
le meilleur.
Non, c'est chouette d'apprendre à faire et aussi d'apprendre à
faire correctement, mais j'avoue que là j'ai un peu peur de pas
tout maîtriser.
Qu'est-ce que tu vas dire de ma solution, alors, avec des
mix-ins ? :-)
la
fonction virtuelle dans la classe de base. (En passant, ça
s'appelle le concept de modèle, ou « template design pattern »
Sauf que par la suite, il a bien dit qu'il n'en voulait qu'une
copie en tout, et non une copie par objet. Et d'après ce qu'il
nous a montré, le tableau pourrait bien être const. Donc :
static fptronde const fonction[] ;
Ceci dit, on pourrait très bien considérer le concept de
stratégie, avec un objet fonctionnel comme délégué. Mais
attention alors au vocabulaire -- ce n'est pas l'objet
fonctionnel de la STL, qui lui, sera copié par valeur, et dont
le type réel est résolu à la compilation.
En fait, tout dépend de la souplesse dont tu as besoin. S'il
faut changer dynamiquement le type de fonction d'un objet
existant, il n'y a que le concept de stratégie -- la délégation
-- qui le permet.
Si le type fonctionnel de l'objet reste
constant, mais il n'est déterminé que lors de la création de
l'objet, le concept de modèle me semble la solution la plus
simple (mais la délégation reste aussi possible). Et enfin, si
on peut permettre de fixer le type fonctionnel lors de la
compilation, on pourrait s'en tirer avec des templates et des
objets fonctionnels à la STL. On perd énormément de souplesse,
mais on gagne nettement en vitesse. (La différence n'est
normalement pas sensible, mais tes fonctions on l'air d'être
bien petites... et du genre qu'on risque de les appeler des
millions de fois.)
En général, les pointeurs à des fonctions membre est considéré
un topique avancé.
double Amp, *PAmp, Freq, *PFreq, Deph, *PDeph, Off, *POff;
//Amplitude
Frequence déphasage offset (numériques fixes) et pointeurs associés.
C'est de très mauvais style de mettre plus d'une définition par
instruction.
Ça fait un moment que
je n'ai pas regardé un livre C++ pour débutants, mais d'après
tout ce que j'entends, "Accelerated C++: Practical Programming
by Example", de Koenig et Moo, serait parmi les meilleurs, sinon
le meilleur.