Analisi.
Deve usare una sorta di puntatore intrusivo (in particolare il conteggio dei riferimenti implementato dall'utente), sebbene potrebbe essere Boost intrusive_ptr
o qualche altro sapore.
La mia opinione personale.
Ho usato puntatori COM Microsoft nei miei progetti e funziona perfettamente. Se il tuo codice deve funzionare solo su Microsoft Windows, questo potrebbe essere il percorso consigliato in quanto il programmatore di sistemi C per Windows avrà probabilmente familiarità con esso. Per tutte le altre considerazioni, incluse le applicazioni multipiattaforma, usa% boost% co_de.
Ho descritto le mie opinioni sull'utilizzo minimo dei puntatori COM Microsoft in questa risposta .
La natura di intrusive_ptr.
È importante capire la natura di intrusive_ptr
. È una classe handle, implementata usando template C ++. Viene fornito in modo che tali oggetti possano essere di proprietà dei chiamanti C ++.
Il codice C non può vedere questa classe di handle dalla loro intestazione include, lascia chiamarne i metodi. Invece, il codice C chiamerebbe alcuni metodi intrusive_ptr
. Ciò significa che fornirai metodi di extern "C"
che a loro volta chiamano i metodi extern "C"
e intrusive_ptr_add_ref
forniti da Boost intrusive_ptr_release
.
link
Che cosa significa.
Chiamare i metodi C ++ su questo oggetto dal codice C richiederà una funzione wrapper per metodo di classe, come questo .
Per gli oggetti che richiedono intrusive_ptr
e add_ref
management, fornirai anche release
delle funzioni wrapper per quelle.
È tua responsabilità documentare in modo ovvio, o comunicare al programmatore C, quali tipi di puntatore nel tuo oggetto vengono conteggiati con riferimento. Una combinazione di convenzione di denominazione, documentazione dell'API, utilizzo dell'API campione, e si consiglia l'avviso verbale.
Infine, comprendi le leggi (regole di proprietà degli oggetti) che devono essere rispettate quando si utilizza il conteggio dei riferimenti. Vedere questa domanda e la risposta .
Argomenti avanzati: cast di tipo oggetto o interfaccia, query di interfaccia, segregazione interfaccia
Ho usato queste tecniche solo con Microsoft COM (tramite il suo metodo extern "C"
), quindi non posso commentare se si possano usare queste tecniche su Boost QueryInterface
quando si programma tramite un'interfaccia intrusive_ptr
.