Ciao a tutti.
Sto aiutando la mia ragazza con un compito di informatica, io ormai lavoro da anni con c# e i ricordi che avevo di puntatori, template ed ecommerciali sono andati persi.
Le è stato chiesto di realizzare un albero binario di ricerca con template.
Ne ha realizzato uno e nel main lo ha implementato inserendo nei nodi dei dati di tipo INT.
Fin qua tutto bene, pare funzionare.
Successivamente è stata aggiunta la richiesta di gestire degli oggetti Rettangolo al posto degli INT, ridefinendo gli operatori "<" e "=" in modo che si valuti l'area dei rettangoli.
Durante l'implementazione però, hanno iniziato a spuntare errori che riguardano i puntatori ma non riusciamo a capire se dobbiamo correggere il main o se è sbagliato il modo in cui è fatto l'albero binario.
Potete darmi qualche dritta?
codice:
template <typename T>
class BinarySearchTree
{
private:
nodo<T> *root;
public:
BinarySearchTree(){root=NULL;};
~BinarySearchTree();
nodo<T>* getroot(){return root;};
void inserimento(T n, nodo<T>* ptr);
};
template <typename T>
void BinarySearchTree<T>::inserimento(T n, nodo<T>* ptr)
{
if(root==NULL)
{
root=new nodo<T>(n);
return;
}
else
{
if(n<ptr->getdato())
{
if(ptr->getsinistro()==NULL) {ptr->setsinistro(new nodo<T>(n));}
else {inserimento(n, ptr->getsinistro());}
}
else
{
if(ptr->getdestro()==NULL) {ptr->setdestro(new nodo<T>(n));}
else {inserimento(n, ptr->getdestro());}
}
}
}
codice:
template <typename T> class nodo
{
private:
T dato;
nodo<T>*sinistro;
nodo<T>*destro;
public:
nodo(const T& item, nodo<T>*ps=NULL, nodo<T>*pd=NULL){dato=item;sinistro=ps;destro=pd;};
~nodo();
nodo<T>*getsinistro(){return sinistro;};
nodo<T>*getdestro(){return destro;};
void setsinistro(nodo<T>*sx){sinistro=sx;}
void setdestro(nodo<T>*dx){destro=dx;}
T getdato(){return dato;};
void setdato(T e){dato=e;};
};
codice:
class rettangolo
{
private:
char *colore;
double base;
double altezza;
public:
rettangolo();
~rettangolo();
rettangolo(char *a, double b, double c);
char *getcolore();
double getbase();
double getaltezza();
double getarea();
void setcolore(char *a);
void setbase(double b);
void setaltezza(double c);
bool operator < (rettangolo &r2) {return this->getarea()<r2.getarea();}
bool operator > (rettangolo &r2) {return this->getarea()>r2.getarea();}
rettangolo &operator = (rettangolo &r2)
{
delete[] colore;
colore=new char[strlen(r2.colore)+1];
strcpy(colore, r2.colore);
base=r2.base;
altezza=r2.altezza;
return *this;
}
};
I problemi sono iniziati ad arrivare dal main.
Se creiamo un rettangolo normalmente, ci viene detto che non riesce a convertire rettangolo in *rettangolo. Quindi lo abbiamo dichiarato come puntatore.
A questo punto è l'inserimento che ha dei problemi e ci dice che non è definita una funzione di inserimento che prenda come parametri un *rettangolo. Aggiungendo la & quando passiamo il rettangolo all'inserimento, dice che non è definita una funzione che prenda un **rettangolo.
Quindi abbiamo pensato di dover modificare l'albero, facendolo lavorare con i doppi puntatori ma non ci riusciamo (e non capiamo perchè modificarlo, dato che con gli altri dati funzionava normalmente).
Qua sotto vedete l'ultima versione del main.
Di sicuro sarà una sciocchezza, ma io con i puntatori proprio non ci so fare.
Qualcuno di voi è per caso in grado di aiutarmi?
codice:
int main()
{
BinarySearchTree<rettangolo> BST;
int base,alt,x;
char *col;
char t;
cout<<"Inserisci colore, base e altezza del rettangolo:"<<endl;
cin>>col>>base>>alt;
rettangolo* r;
r = new rettangolo(col,base,alt);
BST.inserimento(&r, BST.getroot());
delete r;
return 0;
}
Ringrazio anticipatamente chiunque abbia avuto la forza di leggere fino in fondo. Se poi arriverà qualche aiuto, sarò ancora più grato!