Ho una struttura quad-tree in cui ogni nodo ha alcuni dei propri dati, ma ci sono anche dati che si applicano all'intero albero.
Spiegherò la mia attuale soluzione e mi farebbe piacere ricevere feedback sul fatto che questa sia la soluzione migliore o se esistano soluzioni migliori.
Ho due classi:
- Uno per il nodo
- Uno per l'albero
La classe tree contiene un puntatore al nodo radice e i dati rilevanti per quell'albero. I nodi dell'albero hanno bisogno di accedere a quei dati, quindi una opzione sarebbe quella di avere la classe nodo include un membro dati che è un puntatore all'oggetto tree, e quindi invocare i suoi metodi accessor per ottenere i dati.
Ciò aumenterebbe il lato di ogni nodo, tuttavia, così ho deciso di avere un singolo puntatore statico per la classe del nodo. Quando un oggetto tree vuole fare qualcosa a tutti i nodi (la maggior parte degli algoritmi sono ricorsivi a partire dalla radice), prima imposta il puntatore statico in modo che punti ai suoi dati dell'albero (che inserisco in una struct) e poi invoca il static puntatore a puntare ai suoi dati.
Ecco alcuni pseudo-codice:
struct TreeData {
// data relevant to tree as a whole
};
class Tree {
public:
void algorithm() {
root.set_data(&data);
root.algorithm();
};
private:
Node root;
TreeData data;
};
class Root {
public:
static void set_data(TreeData * data) {
tree_data = data;
}
void algorithm() {
// code that uses tree_data
}
private:
static TreeData * tree_data;
};
Volevo evitare che ogni nodo aumentasse di dimensioni, ma possono essere istanziati più alberi alla volta, quindi non può essere solo un dato statico per la classe del nodo.
Quindi dove devo inserire i dati per la struttura ad albero che richiede ogni nodo?