Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment reecrire un cast ?

5 réponses
Avatar
Olivier Miakinen
Bonjour,

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) :

----------------------------------------------------------------------
...
Config *pConfig = ((BuilderApp *)AfxGetApp())->m_pConfig;
pConfig->maFonction();
...
----------------------------------------------------------------------

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 ?


Cordialement,
--
Olivier Miakinen

5 réponses

Avatar
Olivier Miakinen
Le 18/02/2010 20:20, j'écrivais :

----------------------------------------------------------------------
...
Config *pConfig = ((BuilderApp *)AfxGetApp())->m_pConfig;
pConfig->maFonction();
...
----------------------------------------------------------------------



[...]

----------------------------------------------------------------------
...
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++.

Cordialement,
--
Olivier Miakinen
Avatar
Marc Duflot
Olivier Miakinen wrote:

BuilderApp *pApp = dynamic_cast<BuilderApp *>(AfxGetApp());
if (pApp) {
Config *pConfig = pApp->m_pConfig;
pConfig->maFonction();
}
...
----------------------------------------------------------------------
Est-ce correct ?



Oui.
Avatar
Olivier Miakinen
Le 19/02/2010 08:31, Marc Duflot m'a répondu :

Est-ce correct ?



Oui.



Merci de la confirmation, je vais pouvoir livrer la correction.
Avatar
James Kanze
On Feb 19, 7:31 am, Marc Duflot wrote:
Olivier Miakinen wrote:
> BuilderApp *pApp = dynamic_cast<BuilderApp *>(AfxGetApp());
> if (pApp) {
> Config *pConfig = pApp->m_pConfig;
> pConfig->maFonction();
> }
> ...
> ----------------------------------------------------------------------
> 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).

--
James Kanze
Avatar
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