2010-06-11 11 views
6

Heredé una gran aplicación que fue escrita originalmente en C (pero mientras tanto, también se le agregó una gran cantidad de C++). Debido a razones históricas, la aplicación contiene muchos punteros vacíos. Antes de que empiece a ahogarse, permítame explicar por qué se hizo esto.Cómo deshacerse de los huecos-punteros

La aplicación contiene muchas estructuras de datos diferentes, pero se almacenan en contenedores 'genéricos'. Hoy en día usaría contenedores STL con plantillas para ello, o daría a todas las estructuras de datos una clase base común, de modo que el contenedor pueda almacenar punteros a la clase base, pero en los [buenos] viejos días C, la única solución era lanza el struct-pointer a un void-pointer.

Además, hay una gran cantidad de código que funciona en estos vacíos triples, y utiliza las construcciones C muy extrañas para emular polimorfismo en C

ahora estoy reelaboración de la aplicación, y tratando de deshacerse de la huecos-punteros. Agregar una clase base común a todas las estructuras de datos no es tan difícil (pocos días de trabajo), pero el problema es que el código está lleno de construcciones como se muestra a continuación.

Este es un ejemplo de cómo se almacenan los datos:

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

Este es un ejemplo de los datos de cómo se obtiene de nuevo:

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

realidad quiero reemplazar todos los vacíos triples con algún puntero inteligente (contado por referencia), pero no puedo encontrar un truco para automatizar (o al menos) ayudarme a deshacerme de todos los lanzamientos hacia y desde punteros vacíos.

Algún consejo sobre cómo buscar, reemplazar, o interactuar de cualquier manera posible con estas conversiones?

+1

Realmente creo que no hay truco para hacer esto automáticamente. Uno tras otro ... – INS

+0

¿Qué hacen las funciones de almacenamiento y recuperación con 'datatype'? ¿Están haciendo una copia oculta de la estructura o simplemente almacenando ese puntero vacío? –

+0

El tipo de datos se usa para almacenar todos los datos del mismo tipo de datos juntos, y para ejecutar alguna lógica 'común' en los tipos de datos. Como se dijo, emula el polimorfismo en la C. – Patrick

Respuesta

0

Al parecer, no hay manera/truco automatizado para convertir o encontrar todos los usos de vacío triples.Tendré que usar mano de obra manual para encontrar todos los punteros vacíos, en combinación con PC-Lint, que darán errores siempre que haya una conversión incorrecta.

Caso cerrado.

0

Probablemente no necesite deshacerse de los moldes para usar punteros compartidos.

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

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

Por supuesto, esto supone que usted no espera que compartir el mismo puntero a través de llamadas para almacenar/obtención de información. En otras palabras, myCustomer1 y myCustomer2 no comparten el mismo puntero.

7

realidad quiero reemplazar todos los vacíos triples con algunos inteligente puntero (referencia contado), pero no puedo encontrar un truco para automatizar (o por lo menos) ayudar a mí para obtener deshacerse de todos los moldes y de void-pointers.

Dicha refacturación automatizada conlleva muchos riesgos.

De lo contrario, a veces me gusta jugar al hacer trucos de tales funciones void * las funciones de plantilla. Que:

void storeData (int datatype, void *data); 

se convierte en:

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

A primera plantilla implementar simplemente envolviendo la función original (renombrado) y la conversión de los tipos. Eso podría permitirle ver problemas potenciales, ya simplemente compilando el código.

Cuestiones relacionadas