Bonjour,
Je d�veloppe une librairie qui historiquement �tait proc�durale.
Depuis quelques temps d�j�, notre volont� est de faire des refactorings pour la rendre OO et surtout plus clean.
Hors, avec l'OO, nous rencontrons des probl�mes pour �valuer les valeurs de retour des fonctions en debug.
Jusque l�, lorsque nous voulions voir la valeur d'une variable imbriqu�e dans une structure de donn�es il suffisait de breaker dessus et de survoler la variable dans le code.
Par exemple:
Maintenant, mon code ressemble plus � �a :
Code : S�lectionner tout - Visualiser dans une fen�tre � part containerAInst.arrayPtrB[i].valueC // <= En survolant n'importe quelle variable de cette chaine, je pouvais voir sa valeur.
> containerA.h <
> containerA.cpp <
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include "containerB.h" class containerA { private: containerB *arrayPtrB; // Un tableau dynamique public: containerA() {/*init arrayPtrB*/} ~containerA() {/*delete arrayPtrB*/} containerB& operator[](const unsigned int pIndex); containerB& operator[](const unsigned int pIndex) const; containerB& mGetContainerBAt(const unsigned int pIndex); containerB& mGetContainerBAt(const unsigned int pIndex) const; }
> containerB.hpp <
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include "containerA.h" containerB& containerA::mGetContainerBAt(const unsigned int pIndex) { return arrayPtrB[pIndex]; } containerB& containerA::operator[](const unsigned int pIndex) { return mGetContainerBAt(pIndex); } containerB& containerA::mGetContainerBAt(const unsigned int pIndex) const { return const_cast<containerA*>(this)->mGetContainerBAt(pIndex); } containerB& containerA::operator[](const unsigned int pIndex) const { return mGetContainerBAt(pIndex); }
Mon appel � travers des structures devient donc:
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6 class containerB { int valueC; // Oui, c'est public. Il en reste encore quelques uns dans mon code, mais c'est surtout pour l'exemple. int valueB; bool isC; }
Ou:
Code : S�lectionner tout - Visualiser dans une fen�tre � part containerAInst[i].valueC
Le code ci-dessus est tr�s simplifi� : pas de polymorphisme, pas des fonctions virtuelles, juste une surcharge de la fonction mGetContainerBAt et l'op�rateur [].
Code : S�lectionner tout - Visualiser dans une fen�tre � part containerAInst.mGetContainerBAt(i).valueC
Pourtant, que je demande � VC d'�valuer l'un ou l'autre de des deux appel ci-dessus, j'ai toujours une erreur.
Apr�s quelques lecture sur le web et quelques tests, je me suis aper�u que le probl�me venait de la surcharge des fonctions. Si je retire les deux fonctions const de mon code, �a marche.
Mais bon, d'une part je suis oblig� de faire des const_cast un peu partout ou ne plus utiliser d'instance const. D'autre part, c'est quand m�me le but du polymorphisme de pouvoir surcharger des fonctions, les red�finir virtuellement etc...
Pour l'instant, je n'ai que des workarrouds non satisfaisants:
1 - Ajouter dans la watch window "containerAInst.arrayPtrB[i].valueC". <= Trop fastidieux � �crire � chaque fois qu'on a besoin d'une valeur... Et en plus ca oblige � connaitre l'impl�mentation de la fonction appel�e.
2 - Utiliser les autos qui affichent les valeurs de retour des derniers appels. <= Satisfaisant lorsque le type de retour est primitif, mais lorsque c'est une instance d'un objet, on ne peut pas voir toutes les valeurs, ni naviguer dedans.
J'imagine qu'il y a une solution � mon probl�me, pas mal de dev. travaillent sous VC++ au quotidien, mais je n'arrive pas � la trouver.
Pouvez-vous m'aider SVP ?
S'il n'y a pas de solution sous VC++, est-ce que le compilateur d'Intel ou un autre ferait mieux ?
NOTE: Mon code est compos� d'une interface graphique manag�e et d'une lib statique native (pas de MFC). Je d�veloppais sous VS2010 compil� en vc9 (le probl�me �tait identique), mais je viens de migrer mon code en vc11 sous VS2012 depuis quelques jours.
d'avance pour votre aide !!
Ju
Partager