MeHow Opublikowano 15 Kwietnia 2005 Zgłoś Opublikowano 15 Kwietnia 2005 (edytowane) 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 15 Kwietnia 2005 przez MeHow Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
marcinEc Opublikowano 15 Kwietnia 2005 Zgłoś Opublikowano 15 Kwietnia 2005 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) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
MeHow Opublikowano 16 Kwietnia 2005 Zgłoś Opublikowano 16 Kwietnia 2005 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
marcinEc Opublikowano 18 Kwietnia 2005 Zgłoś Opublikowano 18 Kwietnia 2005 Ups, mały błąd, powinno być: friend drzewo<T> &operator+<>(drzewo< T> &, T );bez "T" w "<>" po operator+, powinno działać... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
MeHow Opublikowano 23 Kwietnia 2005 Zgłoś Opublikowano 23 Kwietnia 2005 o stary :D dziala zajedwabiscie :D :D :D wielkie dzieki :D :D :D , teraz moge spokojnie przeciazyc jeszcze += , -= i w ogole wiem jak przeciazac przy templatesach. Jeszcze raz wielkie dzieki :D Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...