Comment reecrire un cast ?

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #21226181
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
Marc Duflot
Le #21228431
Olivier Miakinen wrote:

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



Oui.
Olivier Miakinen
Le #21228991
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.
James Kanze
Le #21240171
On Feb 19, 7:31 am, Marc Duflot
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
Olivier Miakinen
Le #21245331
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 :

Cela dit, merci de l'avoir rappelé, ça me semble en effet un point
important.

Cordialement,
--
Olivier Miakinen
Publicité
Poster une réponse
Anonyme