Ghazi Opublikowano 27 Maja 2008 Zgłoś Opublikowano 27 Maja 2008 (edytowane) Witam Kolegów! Program w założeniu cwiczy poslugiwanie sie szablonami klas, funkcji oraz przeciazanie operatora wyjscia. 99,9% jest ok, jednak pojawił się mały, irytujący problem. W szablonie funkcji "maks" zwracam maksymalna wartosc z tablicy. Tablica jest losowo zapełniana "kwadratami" lub "zesp" (liczbami zepspolonymi). Niestety, w rzeczonej funkcji "maks" wystepuje problematyczny fragment "return max.dlugosc();" Jednak dlugosc jest charakterystyczna dla klasy "zesp" i tym sposobem w szablonie nie moge odnosic sie do klasy "kwadrat", gdzie mam funkcje "pole". Pierwotnie rozwiazalem to nazywajac rozne funkcje w obu klasach tak samo tj. "dlugosc", jednak w "kwadracie" funkcja o nazwie "dlugosc" liczy pole i wygląda to conajmniej mało fachowo. Wpadłem na pomysł, że funkcja będzie zwracać wskaźnik na max'ymalny element tablicy. Tu pojawił się problem z realizacją... Tutaj problematyczny fragment: template <class typ>int lista<typ>::maks(){ typ max = tablica[0][0]; for(int i = 0; i < ilosc; i++) { for(int j = 0; j < ilosc; j++) { if(tablica[i][j] > max) { max = tablica[i][j]; } } } return max.dlugosc();//return lista->max//return lista.max} Chciałem "return max.dlugosc()" zastąpić przez "return lista->max", ale kompilator stwierdza, ze "[C++ Error] popr.cpp(178): E2102 Cannot use template 'lista<typ>' without specifying specialization parameters" Prosze o porady Cały kod » Naciśnij aby pokazać/ukryć tekst oznaczony jako spoiler « - "Pełen kod programu" #include <iostream.h>#include <cstdlib.h>#include <time.h>using namespace std;/////////////////////////////KWADRAT//////////////////////////////////////////////klasa kwadratclass kwadrat{ private: int bok; public: kwadrat(); int pole(void); friend ostream& operator<<(ostream&, kwadrat); bool operator>(kwadrat); bool operator<(kwadrat);};kwadrat::kwadrat() //konstruktor losowy{ bok = rand() % 10 + 1;}int kwadrat::pole(void){ return bok*bok;}bool kwadrat::operator>(kwadrat obiekt){ if(pole() >= obiekt.pole()) { return true; } else return false;}bool kwadrat::operator<(kwadrat obiekt){ if(pole() <= obiekt.pole()) { return true; } else return false;}// przeladowanieostream & operator<<(ostream& wyjscie, kwadrat obiekt){ wyjscie << obiekt.pole(); return wyjscie;}class zesp{ private: int Re; int Im; public: zesp(); int dlugosc(void); friend ostream& operator<<(ostream&, zesp); bool operator>(zesp); bool operator<(zesp);};zesp::zesp(){ Re = rand() % 20 - 10; Im = rand() % 20 - 10;}int zesp::dlugosc(){ return (Re*Re + Im*Im);}bool zesp::operator>(zesp obiekt){ if(dlugosc() >= obiekt.dlugosc()) { return true; } else return false;}bool zesp::operator<(zesp obiekt){ if(dlugosc() <= obiekt.dlugosc()) { return true; } else return false;}////przeladowanieostream & operator<<(ostream& wyjscie, zesp obiekt){ wyjscie << obiekt.dlugosc(); return wyjscie;}template <class typ> //klasa szablonowaclass lista{ private: int ilosc; typ ** tablica; public: lista(); void wyswietl(); void losuj(int); int maks(void); ~lista();};template <class typ>lista<typ>::lista(){ ilosc = 0; tablica = NULL;}template <class typ>void lista<typ>::wyswietl(){ for(int i = 0; i < ilosc; i++) { for(int j = 0; j < ilosc; j++) { cout << tablica[i][j] << ' '; //tutaj wywolanie } cout << endl; }}template <class typ>void lista<typ>::losuj(int ile){ if(ile <= 0) { return; } else { ilosc = ile; tablica = new typ*[ilosc]; for(int i = 0; i < ile; i++) { tablica[i] = new typ[ilosc]; } }}template <class typ>int lista<typ>::maks(){ typ max = tablica[0][0]; for(int i = 0; i < ilosc; i++) { for(int j = 0; j < ilosc; j++) { if(tablica[i][j] > max) { max = tablica[i][j]; } } } return lista->max; //return max.pole();}template <class typ>lista<typ>::~lista(){ delete [] tablica;}int main(){ srand(time(NULL)); lista<kwadrat> LK; LK.losuj(4); LK.wyswietl(); cout << endl; cout << LK.maks() << endl << endl; lista<zesp> LZ; LZ.losuj(4); LZ.wyswietl(); cout << endl; cout << LZ.maks() << endl << endl; system("PAUSE"); return 0;} Edytowane 27 Maja 2008 przez Ghazi Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
tukamon Opublikowano 27 Maja 2008 Zgłoś Opublikowano 27 Maja 2008 na 1 rzut oka template <class typ> typ lista<typ>::maks() { typ max = tablica[0][0]; for(int i = 0; i < ilosc; i++) { for(int j = 0; j < ilosc; j++) { if(tablica[j] > max) { max = tablica[j]; } } } return max; } i w deklaracji tez zmien Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Ghazi Opublikowano 27 Maja 2008 Zgłoś Opublikowano 27 Maja 2008 Dzięki, pomogło :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...