Bonjour,
Je travaille sur la création de ma 1ere API pour contrôler un de mes modules. Etant donné que j'ai beaucoup de choses à contrôler, je passe des flags a plusieurs méthodes dont 2 qui peuvent être assimilées à un Set() et un Get().
On pourrait écrire ça comme suit :
void* permet de faire passer des types quelconques. L'utilisateur est sensé connaitre quel type devra être passé avec tel ou tel control flag.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 bool Set(int ControlFlag, void* Value); bool Get(int ControlFlag, void* Value) const;
Exemple, un appel comme celui la permet de contrôler un path dans le module :
Maintenant pour le Get, j'écris :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 #define MY_PATH 1 ... ... string MyPath="C:\\ToTo"; Set(MY_PATH, const_cast<char *>(MyPath.c_str())); // Set ne modifie jamais les données du void*
Dans ce cas il ne faut surtout pas toucher au pointeur pMyPath et en faire une copie immédiatement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #define MY_PATH 1 ... ... char* pMyPath=NULL; Get(MY_PATH, &pMyPath); // Get renvoie un pointeur interne du module string MyPath=pMyPath;
Je pense que la méthode Set est plus ou moins propre : absence de const, passage obligé par le const_cast pour les string stl.
Le méthode Get me semble moche : possibilité de modifier le buffer interne au module si on ne fait pas attention. Si je demande la taille de la chaine au module, je dois faire une allocation de la chaine à passer, le module recopiera sa chaine dedans, et je devrais refaire une copie dans ma string stl puis un delete de ma chaine. Je préférais avoir un pointeur directement.
J'aimerai avoir vos conseils d'experts sur ces mochetés
Merci.
Partager