ciao .
Ho ripescato questa discussione perchè mi sono trovato di nuovo a creare un pattern composite.
Questa volta il problema sono gli smart pointer , infatti vorrei utilizzarli.
Il problema che mi si è posto di fronte sono le circular reference , ovvero quando uno smart pointer è inserito(incapsulato) in un altra classe di cui si crea uno smart pointer.
ad es io ho un applicazione in cui sono definiti gli smart pointer come Pointer<class>.Quando faccio un typedef ad es :
se ho nella stessa classe ad es :codice:class node : NodeBase { }; typedef Pointer<node> NodePtr // creo lo smart pointer NodePtr
devo rompere la circular reference a manina con una funzione che itera tutto il grafo e rilascia le risorse di m_parent per ogni nodo.codice:class node { std::vector<NodePtr> m_child; NodePtr m_parent; };
Dopo gli oggetti NodePtr funzionano correttamente e le risorse vengono rilasciate in modo corretto.
ora ho due problemi:
1)ho definito una classe NodeBase in cui secondo il tuo consiglio ho inserito tutte le funzioni virtuali.
il dubbio è : quando utilizzare ad es un
typedef Pointer<node> NodePtr ?
o un
typedef Pointer<NnodeBase> NodeBasePtr?
nelle classi derivate?
in pratica nelle classi derivate da nodebase è meglio usare un
insertNode(NodeBasePtr)
o
insertNode(NodePtr)
??
2)come gestire un NodePtr all'interno della classe Node?
Mitaly mi aveva suggerito di usare una forward declaration cosi :
http://forum.html.it/forum/showthrea...hlight=forward vado in contro a qualche problema con questa dichiarazione ?
creo di no perchè Mitaly mi ha sempre consigliato bene , ma non si sa mai.
In particolare ho una variabile membro vector<CMeshPtr> m_Meshes dove CMesh deriva da NodeBase e non riesco ad inserire valori in questa collezione.
Dove devo cercare l'errore?
ma è piu corretto in questa classe utilizzare i nodebaseptr forse?
ma ho letto che meno castsi eseguono meglio è (genericamente).
grazie