[Visual C++ debugger] �valuer des expressions
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:
Code:
containerAInst.arrayPtrB[i].valueC // <= En survolant n'importe quelle variable de cette chaine, je pouvais voir sa valeur.
Maintenant, mon code ressemble plus � �a :
> containerA.h <
Code:
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;
} |
> containerA.cpp <
Code:
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);
} |
> containerB.hpp <
Code:
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;
} |
Mon appel � travers des structures devient donc:
Code:
containerAInst[i].valueC
Ou:
Code:
containerAInst.mGetContainerBAt(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 [].
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.
:merci: d'avance pour votre aide !!
Ju