Ciao a tutti,
ho un problema, sostanzialmente logico.
Ho implementato una semplice classe Bin_tree e ora mi ritrovo a dover crearne una nuova ( Redblack_tree ) utilizzando Bin_tree come base.
Questa e' la classe base:
Come si puo' immaginare la classe si basa sull' utilizzo di oggetti Tnode<>* (nodi dell' albero).codice:template<class T1> class Bin_tree { public: enum { NOT_FOUND = -10, ALREADY_EXIST = -9 }; Bin_tree() : empty(true) {} virtual int store(const T1&); int search(const T1&); T1* get_ptr(int); virtual void remove(int); void destroy(); virtual void print(); bool is_empty() { return empty; } virtual ~Bin_tree() {} protected: Tnode<T1>* get_node(int index) { return nodes[index]; } bool is_error_code(int index) { return index < 0 ? true : false; } virtual Tnode<T1>* make_node() { return new Tnode<T1>; } private: /* ... */ bool empty; std::vector<Tnode<T1>*> nodes; // required for indexing. };
Questa sarebbe invece la classe derivata:
I Tnode<>* sono dei puntatori a nodi progettati per il classico albero binario, nel momento in cui un utente deve implementare qualcosa come un Redblack_tree, questo dovra' anche preoccuparsi di fornire un nodo adeguato ( di tipo derivato da Tnode<> ), come Rbtndoe<>, che aggiunge la nozione di colore ( quindi solamente un mebro di tipo int in piu' ).codice:template<class T1> class Redblack_tree : public Bin_tree<T1> { public: Redblack_tree() : Bin_tree<T1>() {} virtual int store(const T1&); virtual void remove(int); virtual void print(); protected: // Rbtnode<> e' derivato pubblicamente da Tnode<> . virtual Tnode<T1>* make_node() { return new Rbtnode<T1>; } };
Se un membro di una classe derivata vuole un puntatore ad un nodo, questa deve chiamare il membro della classe base get_ptr(), che pero' restituisce un Tnode<>* generico; quindi se per esempio un metodo di Redblack_tree dovesse accedere alla nozione di colore di un Tnode<>*, questa dovrebbe castare il puntatore attraverso un dynamic_cast<Rbtnode<T>* >(some_tnode), per esempio :
Come posso evitare il dynamic_cast<> ?codice:template<class T1> int Redblack_tree<T1>::store(const T1& obj) { bool is_root = this->is_empty(); int obj_index = Bin_tree<T1>::store(obj); if ( is_root ) dynamic_cast<Rbtnode<T1>* >(this->get_node(obj_index))->color = Rbtnode<T1>::black; /* ... */ }

Rispondi quotando
