Domanda

Quindi sto usando un grafico boost del seguente tipo:

typedef boost::adjacency_list<boost::listS, boost::vecS, boost:directedS, VertexT, EdgeT> GraphT

VertexT e EdgeT sono entrambe classi per mantenere molte delle proprietà di cui ho bisogno.Queste sono proprietà in bundle.Non sono sicuro che alcuni dei modi in cui voglio usare bgl siano possibili, quindi se hai familiarità con loro l'aiuto sarebbe molto apprezzato.

Si suppone che VertexT e EdgeT siano classi base polimorfiche.La mia comprensione è che bgl non deve essere utilizzato per i puntatori a queste proprietà.Come si lavora con le proprietà polimorfiche dei vertici e degli spigoli con BGL?Ho pensato di utilizzare puntatori condivisi ma preferirei gestire la memoria da solo.Inoltre questo sembra prevenire un problema quando si utilizza boost :: get per generare la mappa di posizione per i layout boost.

In questo momento ho risolto il problema facendo semplicemente in modo che vertex contenga un altro puntatore alla vera classe polimorfica.Ma sembra troppo complesso.Qualche suggerimento?

È stato utile?

Soluzione

Nelle implementazioni generiche di algoritmi si preferisce usare la semantica dei valori: la copia di un oggetto fa sì che esistano due oggetti identici che sono indipendenti. Questa è una proprietà cruciale quando è necessario duplicare oggetti. Il polimorfismo dinamico non funziona immediatamente con la semantica del valore perché per l'uso del polimorfismo dinamico è necessario trattare con puntatori o riferimenti: quando si utilizzano valori, il tipo statico e il tipo dinamico dell'oggetto coincidono, il che non consente direttamente il polimorfismo dinamico.

L'unico modo per gestire oggetti dinamicamente polimorfi in questo caso è dare loro un aspetto e un aspetto di valore. In effetti, questo significa che devi incapsulare i puntatori ai tuoi oggetti in oggetti che espongono l'interfaccia del valore richiesto (puoi anche incapsulare i riferimenti se insisti, ma non ho mai scoperto che funzioni bene). La libreria Boost Graph non si preoccupa di come le varie strutture siano rappresentate internamente purché abbiano l'interfaccia richiesta e implementino la semantica richiesta. Da quello che descrivi l'utilizzo di un wrapper per i tuoi puntatori agli oggetti polimorfici è la strada giusta da percorrere. Che tu mantenga l'oggetto tramite uno dei puntatori intelligenti standard o in modo diverso non ha molta importanza, anche se immagino che l'uso di qualcosa come boost::shared_ptr<T> o std::shared_ptr<T> rimuova una serie di complicazioni inutili.

Detto questo, vorrei sottolineare che raramente trovo esempi utili di oggetti dinamicamente polimorfi combinati con algoritmi! Sì, ce ne sono alcuni, ma il più delle volte l'uso del polimorfismo dinamico contribuisce al problema, non alla soluzione (nonostante quello che dicono molte persone che hanno solo esposizione alla tecnica orientata agli oggetti; tuttavia, se l'unico strumento che conosci è un martello , ogni problema sembra un chiodo).

Altri suggerimenti

Penso che tu stia sostanzialmente risolvendo lo stesso problema di questa domanda:

solo per le proprietà (raggruppate).Suggerirei di poter eseguire il polimorfismo invocando modelli di funzioni indipendenti.


Per veri macchinari ad alta potenza:

Vedi anche questo documento: Sulla tensione tra programmazione orientata agli oggetti e programmazione generica in C ++ ;quel documento descrive la cancellazione del tipo che è una specie di "soluzione" definitiva per disaccoppiare / colmare le esigenze di runtime / polimorfismo statico.(_Nota che librerie come Boost Variant, Boost Any sono molto più convenienti se devi implementare la cancellazione del tipo).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top