Pergunta

Eu herdei um grande aplicativo que foi originalmente escrito em C (mas, nesse meio tempo, muito C ++ também foi adicionado a ele). Por razões históricas, o aplicativo contém muitos pontos vazios. Antes de começar a sufocar, deixe -me explicar por que isso foi feito.

O aplicativo contém muitas estruturas de dados diferentes, mas são armazenadas em contêineres 'genéricos'. Atualmente, eu usaria contêineres STL modelos para ele, ou daria a todas as estruturas de dados uma classe base comum, para que o contêiner possa armazenar ponteiros para a classe base, mas no [bom?] Antigo C Days, a única solução era para lance o ponteiro da estrutura para um ponto vazio.

Além disso, há muito código que funciona nesses pontos vazios e usa construções C muito estranhas para imitar o polimorfismo em C.

Agora estou reformulando o aplicativo e tentando me livrar dos pontos vazios. Adicionar uma classe base comum a todas as estruturas de dados não é tão difícil (poucos dias de trabalho), mas o problema é que o código está cheio de construções como mostradas abaixo.

Este é um exemplo de como os dados são armazenados:

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

Este é um exemplo de como os dados são buscados novamente:

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

Na verdade, eu quero substituir todos os pontos vazios por alguns pontos inteligentes (montados em referência), mas não consigo encontrar um truque para automatizar (ou pelo menos) me ajudar a me livrar de todos os elencos de e para void- Ponteiros.

Alguma dica sobre como encontrar, substituir ou interagir de alguma maneira possível com essas conversões?

Foi útil?

Solução 3

Aparentemente, não existe uma maneira/truque automatizada para converter ou encontrar todos os usos dos pontos vazios. Vou ter que usar mão de obra manual para encontrar todos os pontos vazios, em combinação com o PC-LINT que dará erros sempre que houver uma conversão incorreta.

Caso encerrado.

Outras dicas

Na verdade, eu quero substituir todos os pontos vazios por alguns pontos inteligentes (montados em referência), mas não consigo encontrar um truque para automatizar (ou pelo menos) me ajudar a me livrar de todos os elencos de e para void- Ponteiros.

Essa refatoração automatizada tem muitos riscos.

Caso contrário, às vezes eu gosto de fazer peças, fazendo com que tais funções de vazio* as funções do modelo. Este:

void storeData (int datatype, void *data);

torna-se:

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

No início, o Modelo de Implementar simplesmente envolvendo a função original (renomeada) e convertendo os tipos. Isso pode permitir que você veja problemas em potencial - já compilando o código.

Você provavelmente não precisa se livrar dos elencos para usar ponteiros compartilhados.

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

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

Obviamente, isso pressupõe que você não espera compartilhar o mesmo ponteiro entre chamadas para armazenar/buscar. Em outras palavras, Mycustomer1 e Mycustomer2 não compartilham o mesmo ponteiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top