Skocz do zawartości
MeHow

Przeciazenie Operatora We Wzorcu Drzewa Binarnego

Rekomendowane odpowiedzi

Witam. Pisze wzorzec drzewa binarnego, na ktorym nastepnie zrealizuje slownik. Mam jednak problem. Chcialem przeciazyc dodawanie tak, zeby zapis drzewo+5; dzialalo tak, ze dodaje wartosc '5' do drzewa. Napotkalem jednak blizej mi nieznany problem, ktorego nie moge rozwiazac. Ponizej umieszczam kod. Nie jest to wszystko, bo wszystko niepotrzebne. Zamiescilem tylko definicje klas i funkcje, ktore sa potrzebe przy przeciazaniu +.

 

Prosilbym o pomoc :)

 

 

 

template<class T> class wierzcholek;template< class T > class drzewo {    friend class wierzcholek<T>;    friend drzewo< T > &operator+(drzewo< T> &, T );        public:        drzewo();	~drzewo();        void wypisz_wszystko( void );	bool wstaw_dane( const T& );	bool wyszukaj( const T& );	bool zapisz( const char [] );	bool wczytaj( const char [] );	void usun( const T& );	int ile( void );	//void wywaz( void );    private:	wierzcholek<T> *korzen; //wskaznik wskazujacy poczatek drzewa};//poczatek przeciazonego +template< class T >drzewo< T > &operator+( drzewo< T > &tree1 , T dana ) {    tree1->wstaw_dane( dana );}//POCZATEK WSTAW DANEtemplate< class T >bool drzewo< T >::wstaw_dane( const T &dana ) {     if(korzen == NULL) {         korzen = new wierzcholek<T>;  korzen->dane = dana;     }     else {         korzen->nowy_element( dana );     }}//KONIEC WSTAW DANEtemplate< class T >class wierzcholek {          friend class drzewo< T >;          public:          wierzcholek();          void dodaj_prawy( void );   bool znajdz( const T& );   bool nowy_element( const T& );          void wypisz_all( void );   void dodaj_lewy( void );   void wstaw( const T& );   void usun_all( void );   bool save( const char [] );   int ile_elementow( int& );   //void wywaz_drzewo( void );   bool del( const T& );     private:          wierzcholek< T > *lewy;   wierzcholek< T > *prawy;   T dane;};//////poczatek nowy_element ////////////template< class T >bool wierzcholek< T >::nowy_element( const T &dana) {     static wierzcholek< T > *aktualny;     aktualny = this;     while(1) {          if(dana > (aktualny->dane)) {              if((aktualny->prawy) ==  NULL) {                  aktualny->dodaj_prawy();                  aktualny = aktualny->prawy;                  aktualny->wstaw( dana );                  return true;              }              else {                  aktualny = aktualny->prawy;              }          }          if(dana < (aktualny->dane)) {              if((aktualny->lewy) == NULL) {                  aktualny->dodaj_lewy();                  aktualny = aktualny->lewy;                  aktualny->wstaw( dana );                  return true;              }              else {                  aktualny = aktualny->lewy;              }          }          if(dana == (aktualny->dane)) {              return false;          }     }}////koniec nowy element
Edytowane przez MeHow

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

1. To może ci pomóc wybrać właściwy rodzaj relacji pomiędzy wzorcem klasy, a funkcją zaprzyjaźnioną:

http://publib.boulder.ibm.com/infocenter/m...d_templates.htm

 

2. A widziałeś co pokazuje kompilator?

a.cpp:12: warning: friend declaration `drzewo<T>& operator+(drzewo<T>&, T)' decl

ares a non-template function

a.cpp:12: warning: (if this is not what you intended, make sure the function tem

plate has already been declared and add <> after the function name here) -Wno-no

n-template-friend disables this warning

 

Tak naprawdę kompilator nie wie co TY chcesz zrobić, ale mówic ci co możesz zrobić :)

Przerzuć deklarację operatora+ PRZED deklaracje klasy drzewo i dodaj "<>" po nazwie, to wtedy kompilator będzie wiedział, że chcesz użyć szablonu funkcji:

[....]//!!template<class T> class drzewo; // forward declaration!//!! najpierw szablon funkcji//poczatek przeciazonego +template< class T >drzewo< T > &operator+( drzewo< T > &tree1 , T dana ) {   tree1->wstaw_dane( dana );}//!!template< class T > class drzewo {   friend class wierzcholek<T>;   friend drzewo< T > &operator+<T>(drzewo< T> &, T ); //!! tu zmiana[.....]
Powinno pomóc.

 

3. Żeby już wszystko wyłapać:

In member function `bool drzewo<T>::wstaw_dane(const T&)':

warning: no return statement in function returning non-void

 

Nie zwracasz wartości!

 

4. W C++ raczej nie powinno używać sie NULL, tylko '0' (zero)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

no coz, neistety nie dziala.

 

Poprawilem tak jak sugerowales, ale sypie bardzo dziwnymi i niezrozumialymi dla mnie bledami :(

 

Caly kod programu zamieszczam wiec teraz do sciagniecia, jesli bylbys na tyle mily i powiedzial mi co jest nie tak, bede bardzo wdzieczny.

KOD: http://paranoya.org/~mehow/pro2.cpp

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...