2010-04-07 13 views
6

Sto imparando C++ da zero, e come tale non ho una conoscenza approfondita di C. In C++, non puoi lanciare un puntatore vuoto a qualsiasi cosa, e capisco le ragioni dietro a ciò. Tuttavia, lo so che in C, puoi. Quali sono le possibili ragioni per questo? Sembra proprio che sia un enorme buco nella sicurezza del tipo, che (per me) sembra una brutta cosa.Quali sono i motivi per lanciare un puntatore void?

risposta

13

È possibile trasmettere un void* a un altro puntatore in entrambe le lingue. Forse intendevi implicitamente.

È molto conveniente in C non dover essere espliciti a riguardo. In C++ abbiamo i template, quindi per scrivere codice generico non è necessario il casting void* e quant'altro. In C non c'è scelta. Un contenitore generico deve contenere void* in oggetti, ed è molto più facile dire ripetutamente mydata* d = node; quindi è mydata* d = (mydata*)node;.

Quindi è praticamente come hai detto tu. In genere la sicurezza di tipo C non ha ricevuto molta enfasi come in C++, specialmente quando si trattava di void* perché doveva essere un semplice puntatore generico a qualsiasi cosa. Non ce n'è bisogno in C++, quindi rendilo più esplicito quando hai a che fare con esso.

+0

Ottima risposta, grazie! – Maulrus

0

Un motivo: se si utilizza sort per ordinare una matrice di strutture e si dispone di una funzione di confronto per le due strutture, è necessario eseguire il cast dei puntatori void sui puntatori alle strutture per accedere ai membri della struttura.

1

Quali sono i possibili motivi per [lanciare un puntatore void * in C]? Non è un buco gigante nella sicurezza del tipo?

È l'unico modo possibile per supportare il polimorfismo, ovvero la programmazione generica. Non c'è altro modo di fare, ad es. Una tabella hash generica. Il polimorfismo in C è selvaggiamente pericoloso, ma è l'unico polimorfismo che esiste.

Sii contento che C++ abbia un polimorfismo parametrico (una delle molte funzioni dei modelli).

Problemi correlati