Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2014
    residenza
    Genova
    Messaggi
    1

    [C++] Problema con albero binario e template

    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!

  2. #2
    Il codice dell'albero gestisce gli oggetti per valore, non per puntatore, per cui non devi creare alcun puntatore a rettangolo. Nel main il problema se fai
    codice:
    rettangolo *r;
    r = new rettangolo(col, base, alt);
    deriva dal fatto che new alloca un rettangolo nell'heap, e quindi restituisce un puntatore a rettangolo, che tu invece cerchi di assegnare ad un oggetto rettangolo (la confusione probabilmente ti deriva dal fatto che in C# tutte le classi sono tipi "by reference", e tutte le variabili di un certo tipo in realtà sono puntatori sotto mentite spoglie gestiti dal GC). Se vuoi creare un oggetto rettangolo direttamente sullo stack chiamandone un certo costruttore la sintassi è semplicemente:
    codice:
        rettangolo r(col,base,alt);
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.