2010-06-11 6 views
6

J'ai hérité d'une grosse application écrite à l'origine en C (mais en même temps beaucoup de C++ y ont été ajoutés). Pour des raisons historiques, l'application contient beaucoup de pointeurs de vide. Avant de commencer à étouffer, laissez-moi vous expliquer pourquoi cela a été fait.Comment se débarrasser de void-pointers

L'application contient de nombreuses structures de données différentes, mais elles sont stockées dans des conteneurs «génériques». De nos jours j'utiliserais des conteneurs STL basés sur des templates, ou je donnerais à toutes les structures de données une classe de base commune, de sorte que le conteneur puisse stocker des pointeurs vers la classe de base, mais dans les [vieux? transtyper le struct-pointer en un pointeur vide.

De plus, il y a beaucoup de code qui fonctionne sur ces vides points, et utilise des constructions C très étranges à imiter polymorphisme C.

Je retravaille maintenant l'application, et en essayant de se débarrasser de la void-pointeurs. L'ajout d'une classe de base commune à toutes les structures de données n'est pas si difficile (quelques jours de travail), mais le problème est que le code est plein de constructions comme indiqué ci-dessous.

Voici un exemple de la façon dont les données sont stockées:

void storeData (int datatype, void *data); // function prototype 
... 
Customer *myCustomer = ...; 
storeData (TYPE_CUSTOMER, myCustomer); 

Voici un exemple de la façon dont les données sont extraites de nouveau:

Customer *myCustomer = (Customer *) fetchData (TYPE_CUSTOMER, key); 

Je veux vraiment remplacer tous les pointeurs de vides avec un peu de smart-pointeur (reference-counted), mais je ne trouve pas de truc pour automatiser (ou du moins) m'aider à me débarrasser de tous les lancements de et vers les pointeurs de void.

Des conseils sur la façon de trouver, de remplacer ou d'interagir de quelque manière que ce soit avec ces conversions?

+1

Je crois vraiment qu'il n'y a pas de truc pour le faire automatiquement. L'un après l'autre ... – INS

+0

Que font les fonctions de stockage et de récupération avec 'datatype'? Est-ce qu'ils font une copie aveugle de la structure ou simplement stocker ce pointeur vide? –

+0

Le type de données est utilisé pour stocker toutes les données du même type de données et pour exécuter une logique «commune» sur les types de données. Comme dit, il émule le polymorphisme en C. simple – Patrick

Répondre

0

Apparemment, il n'y a pas de manière/astuce automatique pour convertir ou trouver toutes les utilisations de pointeurs de vide.Je vais devoir utiliser le travail manuel pour trouver tous les pointeurs de vide, en combinaison avec PC-Lint qui donnera des erreurs chaque fois qu'il y a une conversion incorrecte.

Cas fermé.

0

Vous n'avez probablement pas besoin de vous débarrasser des conversions pour utiliser des pointeurs partagés.

storeData(TYPE_CUSTOMER, myCustomer1->get()); 

shared_ptr<Customer> myCustomer2(reinterpret_cast<Customer*>fetchData(TYPE_CUSTOMER, "???"); 

Bien sûr, cela suppose que vous ne vous attendez pas partager le même pointeur sur les appels à stocker/chercher. En d'autres termes, myCustomer1 et myCustomer2 ne partagent pas le même pointeur.

7

Je veux vraiment remplacer tous les vides -pointeurs avec une puce pointeur (comptage de références), mais je ne peux pas trouver une astuce pour automatiser (ou au moins) me aider à obtenir débarrasser de tous les moulages à et de pointeurs de vide.

Un tel refactoring automatisé comporte de nombreux risques.

Sinon, parfois j'aime jouer des tours en faisant sortir de telles fonctions * le modèle. Que:

void storeData (int datatype, void *data); 

devient:

template <class T> 
void storeData (int datatype, T *data); 

Tout d'abord mettre en œuvre modèle en enroulant simplement la fonction d'origine (renommé) et la conversion des types. Cela pourrait vous permettre de voir les problèmes potentiels - déjà en compilant simplement le code.

Questions connexes