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 :

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;
void* permet de faire passer des types quelconques. L'utilisateur est sensé connaitre quel type devra être passé avec tel ou tel control flag.

Exemple, un appel comme celui la permet de contrôler un path dans le module :

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*
Maintenant pour le Get, j'écris :

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;
Dans ce cas il ne faut surtout pas toucher au pointeur pMyPath et en faire une copie immédiatement.

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.