PDA

View Full Version : [C++] Alberi binari di ricerca


Baronerosso9
09-12-2008, 15:40
Ciao a tutti.
Spero che qualcuno mi possa dare una mano...ho un esame tra una settimana e devo consegnare un progettino che il compilatore non ne vuole sapere di compilare. Vi spiego...
Devo fare un dizionario implementato con un albero binario di ricerca. Per adesso sto costruendo la classe "Element" che va a rappresentare un singolo nodo.(Lo implemento coi templates...)
Ora...voglio dare un ID univoco ad ogni nodo...ho pensato di farlo usando una variabile statica inizializzata a zero. Xò il compilatore mi da errore, dice ke è proibito inizializzare una variabile statica...(cosa ke in Java facevo tranquillamente).
Un altro errore me lo da quando provo a definirgli un operatore di copia che mi renda valido fare una cosa del tipo: oggetto_elemento<rational>= numero_razionle.
Ma mi da errore...ho provato in diversi modi, ma continua a darmi errori...
Vi scrivo il codice:

#include <iostream>
#include <math.h>


template <class T>
class Element{
private:

unsigned int id;
static unsigned int next_id=0;
T* value;
Element* Dad;
Element* Right;
Element* Left;

public:

Element(){id=next_id; next_id++; Dad=NULL; Left=NULL; Right=NULL; value = NULL;}
Element& operator=(T& n){ //mi permette di fare elemento<rational>= razionale;
if (&n==value)
return *this;
if (value!=NULL)
delete(value);
value = new T(n);
return *this;
}
Element(T& n){id=next_id; next_id++; Dad=NULL; Left=NULL; Right=NULL; &this=n; }
/* operator= da definire per T */
//?Element(T* ptr){id=next_id; next_id++; Dad=NULL; Left=NULL; Right=NULL; value=*ptr;}

Element(const Element& n){
id=next_id; next_id++; Dad=NULL; Left=NULL; Right=NULL; &this=n.value; }

unsigned int Key()const{return id;}
T data()const{ return *value;}
Element* dx() const{return Right;}
Element* sx() const{return Left;}
Element* px() const{return Dad;}

bool operator==(const Element& p) const{return id==p.id;}
bool operator>(const Element& el){
return id>el.id;
}
bool operator>=(const Element& el){
return id>=el.id;
}
bool operator<=(const Element& el){
return id<=el.id;
}
bool operator<(const Element& el){
return id<el.id;
}
bool operator!=(const Element& el){
return id!=el.id;
}
};

template<class T>
std::ostream& operator<<(std::ostream& os, const Element<T>& p){
os << p.data(); //Da definire l'operator<< per T
return os;
}


Gli errori che mi da sono questi:
Element.h:13: error: ISO C++ forbids in-class initialization of non-const static member ‘next_id’
main.cpp: In function ‘int main()’:
main.cpp:6: error: assignment of function ‘Element<char> e()’
main.cpp:6: error: cannot convert ‘char’ to ‘Element<char> ()()’ in assignment
main.cpp:7: warning: the address of ‘Element<char> e()’, will always evaluate as ‘true’
make: *** [main] Error 1

Vi ringrazio infinitamente!!
Vi prego aiutatemi...sono nel panico più totale...:help:

sottovento
09-12-2008, 16:27
Il compilatore si arrabbia per qualcosa che e' nel main()... potresti postarlo?

Baronerosso9
09-12-2008, 16:59
Il compilatore si arrabbia per qualcosa che e' nel main()... potresti postarlo?

Il main l'ho fatto proprio semplicissimo,giusto per vedere se funziona, eccolo:#include "Element.h"

int main(){
char a('q');
Element<char> e();
e= a;
std::cout<<e;
return 0;
}


Grazie mille per l'aiuto!

sottovento
09-12-2008, 17:25
Il main l'ho fatto proprio semplicissimo,giusto per vedere se funziona, eccolo:#include "Element.h"

int main(){
char a('q');
Element<char> e();
e= a;
std::cout<<e;
return 0;
}


Grazie mille per l'aiuto!

Sembra che tu voglia chiamare una funzione il cui nome e' "e". Non penso sia l'effetto che volevi ottenere, visto il codice seguente.

Prova a togliere le parentesi ()...

Alex_87_xelA
09-12-2008, 18:13
per quanto riguarda questo


static unsigned int next_id=0;


se ti da errore significa che hai un comilatore non recente quindi non standardizzato.

e potresti fare in queto modo.

fuori dalla classe Element


template<class T> unsigned int Element<T>::next_id = 0;


così dovresti risolvere il problema in quel punto

fammi sapere

Alex_87_xelA
09-12-2008, 18:23
#include "Element.h"

int main(){
char a('q');
Element<char> e();
e= a;
std::cout<<e;
return 0;
}




Quello che ho messo in grassetto ... devi fare come ti ha detto sottovento ... togli le parentesi perchè senò il compilatore lo vede come il prototipo(dichiarazione, interfaccia "non so come lo chiami tu :D ") di una funzione (cosa che non è).

Baronerosso9
09-12-2008, 21:15
Quello che ho messo in grassetto ... devi fare come ti ha detto sottovento ... togli le parentesi perchè senò il compilatore lo vede come il prototipo(dichiarazione, interfaccia "non so come lo chiami tu :D ") di una funzione (cosa che non è).

Grazie mille!!Lo provo subito!:)

Baronerosso9
09-12-2008, 21:33
Niente...:cry:
il problema della variabile static c'è ancora (mi da proprio lo stesso errore di prima)
E l'altro problema permane si è trasformato in un:
35 missing template arguments before ';' token
e vari altri missing....:muro:

Baronerosso9
09-12-2008, 21:40
Avevo pensato che forse i "missing bla bla..." erano dovuti a next_id++; senza Element<T>::next_id++; Ma se ce lo metto l'errore resta!

sottovento
09-12-2008, 22:55
Puoi postare la nuova lista di errori/warning?

Alex_87_xelA
09-12-2008, 23:03
A me così parte e non da nessun errore provalo


#include <iostream>
#include <math.h>


template <class T>
class Element{
private:

unsigned int id;
static unsigned int next_id;
T* value;
Element* Dad;
Element* Right;
Element* Left;

public:

Element(){id=next_id; next_id++; Dad=NULL; Left=NULL; Right=NULL; value = NULL;}
Element& operator=(T& n){ //mi permette di fare elemento<rational>= razionale;
if (&n==value)
return *this;
if (value!=NULL)
delete(value);
value = new T(n);
return *this;
}
Element(T& n){id=next_id; next_id++; Dad=NULL; Left=NULL; Right=NULL; &this=n; }
/* operator= da definire per T */
//?Element(T* ptr){id=next_id; next_id++; Dad=NULL; Left=NULL; Right=NULL; value=*ptr;}

Element(const Element& n){
id=next_id; next_id++; Dad=NULL; Left=NULL; Right=NULL; &this=n.value; }

unsigned int Key()const{return id;}
T data()const{ return *value;}
Element* dx() const{return Right;}
Element* sx() const{return Left;}
Element* px() const{return Dad;}

bool operator==(const Element& p) const{return id==p.id;}
bool operator>(const Element& el){
return id>el.id;
}
bool operator>=(const Element& el){
return id>=el.id;
}
bool operator<=(const Element& el){
return id<=el.id;
}
bool operator<(const Element& el){
return id<el.id;
}
bool operator!=(const Element& el){
return id!=el.id;
}
};

template<class T>
std::ostream& operator<<(std::ostream& os, const Element<T>& p){
os << p.data(); //Da definire l'operator<< per T
return os;
}

template <class T>
unsigned int Element<T>::next_id = 0;


int main()
{
char a('q');
Element<char> e;
e= a;
std::cout<<e;
return 0;
}


Ma l'aggiunta che ti avevo detto di fare in quanto alla funzione static l'hai messa in Element.h ?

Baronerosso9
10-12-2008, 14:10
Ma l'aggiunta che ti avevo detto di fare in quanto alla funzione static l'hai messa in Element.h ?

Grandissimo così parte anche a me...:) :) Grazie mille. Cmq si, l'avevo messo su element.h all'interno...chissà perchè in quel modo non gli piace al compilatore...
Grazie ancora, non sai quanto mi hai aiutato così!!
(Se avessi altri problemi li posto) ;)

Alex_87_xelA
10-12-2008, 18:18
Grandissimo così parte anche a me...:) :) Grazie mille. Cmq si, l'avevo messo su element.h all'interno...chissà perchè in quel modo non gli piace al compilatore...
Grazie ancora, non sai quanto mi hai aiutato così!!
(Se avessi altri problemi li posto) ;)

A disposizione :D