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 :
codice:
class node : NodeBase
{

};
typedef Pointer<node> NodePtr // creo lo smart pointer NodePtr
se ho nella stessa classe ad es :
codice:
class node
{
std::vector<NodePtr> m_child;
NodePtr m_parent;
};
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.

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