Je vais tenter d'être clair dans ma question, merci de me pardonner
d'avance si ce n'est pas le cas car je connais beaucoup plus le C que le
C++. Ne pas hésiter à me reprendre au besoin.
Tout d'abord le contexte. Je participe à la maintenance de programmes
écrits en Visual C++. Parmi ceux-ci il y a deux exécutables, disons
« Builder.exe » et « Engine.exe », qui partagent une grosse partie de
code commun. Voici un extrait du code commun (je l'ai un peu réécrit
pour changer les noms des classes, j'espère n'avoir pas introduit de
coquilles lors de l'opération) :
Je précise que la fonction AfxGetApp() est une fonction Microsoft
définie en gros comme suit :
----------------------------------------------------------------------
CWinApp* AfxGetApp();
----------------------------------------------------------------------
Par ailleurs, quand on est dans Builder.exe ce CWinApp* est en fait
un BuilderApp*, mais quand on est dans Engine.exe c'est un EngineApp* :
----------------------------------------------------------------------
class BuilderApp : public CWinApp { ... };
class EngineApp : public CWinApp { ... };
----------------------------------------------------------------------
Vous l'aurez sans doute deviné, mon problème est que je veux appeler le
code indiqué au début quand je suis dans Engine, et détecter proprement
que je n'ai pas le droit de faire le cast « à la C » ni d'appeler la
fonction maFonction(). J'ai fait des recherches par moi-même, et j'ai
cru comprendre que je devais écrire le code comme ceci :
----------------------------------------------------------------------
...
BuilderApp *pApp = dynamic_cast<BuilderApp *>(AfxGetApp());
if (pApp) {
Config *pConfig = pApp->m_pConfig;
pConfig->maFonction();
}
...
----------------------------------------------------------------------
Est-ce correct ?
Je viens de faire le test, et ça /semble/ fonctionner comme il faut aussi bien dans Engine que dans Builder. Mais comme je me méfie de la « programmation par accident » (merci Bruno Desthuilliers pour l'expression) je préfèrerais avoir l'avis de gourous du C++.
Je viens de faire le test, et ça /semble/ fonctionner comme il faut
aussi bien dans Engine que dans Builder. Mais comme je me méfie de
la « programmation par accident » (merci Bruno Desthuilliers pour
l'expression) je préfèrerais avoir l'avis de gourous du C++.
Je viens de faire le test, et ça /semble/ fonctionner comme il faut aussi bien dans Engine que dans Builder. Mais comme je me méfie de la « programmation par accident » (merci Bruno Desthuilliers pour l'expression) je préfèrerais avoir l'avis de gourous du C++.
À condition que la classe renvoyée par AfxGetApp ait au moins une fonction virtuelle (ce qui est apparamment le cas, puisque le code marche).
-- James Kanze
Olivier Miakinen
Bonjour,
Le 21/02/2010 11:32, James Kanze m'a répondu :
[dynamic_cast] > Est-ce correct ?
Oui.
À condition que la classe renvoyée par AfxGetApp ait au moins une fonction virtuelle (ce qui est apparamment le cas, puisque le code marche).
En effet. D'ailleurs les recherches que j'avais faites m'avaient amené à la page suivante, que j'avais oublié de citer, mais qui précise bien la nécessité d'avoir au moins une fonction virtuelle : <http://cpp.developpez.com/faq/cpp/?page=conversions>.
Cela dit, merci de l'avoir rappelé, ça me semble en effet un point important.
Cordialement, -- Olivier Miakinen
Bonjour,
Le 21/02/2010 11:32, James Kanze m'a répondu :
[dynamic_cast]
> Est-ce correct ?
Oui.
À condition que la classe renvoyée par AfxGetApp ait au moins
une fonction virtuelle (ce qui est apparamment le cas, puisque
le code marche).
En effet. D'ailleurs les recherches que j'avais faites m'avaient amené
à la page suivante, que j'avais oublié de citer, mais qui précise bien
la nécessité d'avoir au moins une fonction virtuelle :
<http://cpp.developpez.com/faq/cpp/?page=conversions>.
Cela dit, merci de l'avoir rappelé, ça me semble en effet un point
important.
À condition que la classe renvoyée par AfxGetApp ait au moins une fonction virtuelle (ce qui est apparamment le cas, puisque le code marche).
En effet. D'ailleurs les recherches que j'avais faites m'avaient amené à la page suivante, que j'avais oublié de citer, mais qui précise bien la nécessité d'avoir au moins une fonction virtuelle : <http://cpp.developpez.com/faq/cpp/?page=conversions>.
Cela dit, merci de l'avoir rappelé, ça me semble en effet un point important.