[ fanfare @ 17.01.2010. 08:35 ] @
Dobio sam zadatak : Definisati generičku klasu Skup koja omogućava manipulaciju skupom podataka određenog tipa. Podaci koji pripadaju skupu treba da se drže u nizu koji se dinamički kreira. Parametar šablona je tip podataka koji se drže u nizu. Osim toga, šablon može da ima i jedan stvarni argument koji predstavlja inicijalnu podrazumijevanu veličinu skupa, odnosno dinamičkog niza u kojem se drže elementi skupa. Osim konstruktora i destruktora, treba minimalno implementirati: • funkciju članicu koja omogućava dodavanje novog elementa u skup ako dati element ne postoji u skupu. Ako se skup napuni, treba omogućiti povećavanje kapaciteta dinamičkog niza u kojem se drže elementi skupa; • funkciju članicu koja omogućava "izbacivanje" nekog elementa iz skupa; i • prijateljsku operatorsku funkciju kojom se preklapa operator << čime se ispisuju svi elementi skupa na odgovarajućem izlaznom toku. Napisati program koji učitava neki string, a zatim analizira sadržaj tog stringa. Svako slovo u stringu treba dodati u skup slova, svaku cifru u skup cifara i sl. Na kraju treba ispisati svaki skup na standardni izlaz. Za kreiranje odgovarajućih skupova treba koristiti generičku klasu Skup. Moj kod: Code: #include<iostream> using namespace std; template <class T,int N=20> // N je inicijalna veliiina skupa class Skup { public: Skup() { n=0 ; max=N; element= new T[max]; } void dodaj(T dd); void izbaci(T dd); friend ostream & operator <<(ostream &out,Skup &skup) { for(int i=0; i<n; i++) { out << skup.element[i] <<" "; } return out; } ~Skup() {delete [] element; } protected: T *element; // pokazuje na element int n ; // broj elemenata (lokacija gdje se upisuje sledeci element) int max; // max broj elemenata }; template <class T,int N> void Skup<T,N> ::dodaj(T dd) { int postoji=0; // indikator stanja elementa int ii=0; // lokacija gdje treba upisati novi element for(int i=0;i<n;i++) // provjera da li elemenat postoji u skupu { if (element[i]<dd && element[i+1]>dd) ii=i+1 ; if (element[i]==dd) { postoji=1; cout<<"Postoji isti element"; break; } } if(!postoji) // ako nema elementa u skupu,dodajemo ga { element[n]=dd; n++; } }; template <class T,int N> void Skup<T,N> ::izbaci(T dd) { for(int i=0; i<n; i++) { if(element[i]==dd) { for(int j=i; j<n; j++) element[j]=element[j+1]; n--; break; } } }; /* dodatna funkcija(nije clanica klase) a pretvara string u broj */ int broj(const char*s) { int n=0,i=0; bool negativan=false; if(s[i]=='-') { negativan=true; i++; } while(s[i]) { n*=10; n+=s[i]-'0'; i++; } return ((negativan) ? (-n):(n)); } main() { Skup<int>cifra; Skup<char>slovo; char string[255]; cout << "Unesite neki string: "; cin.getline(string,255); // ucitavanje stringa int i=0; // trenutni polozaj u stingu while(string[i]) { // znak+cifre=negativan broj if(string[i]=='-' && string[i+1]>='0' && string[i+1]<='9') { int j=i+1; while(string[j]>='0' && string[j]<='9') { cifra.dodaj(string[j]-'0'); j++; } char *pom=new char[j-i+1]; strncpy(pom,&string[i],j-i); pom[j-i]='0'; cifra.dodaj(broj(pom)); i=j; continue; } // cifre,brojevi if(string[i]>='0' && string[i]<='9') { int j=i; while(string[i]>='0' && string[i]<='9') { cifra.dodaj(string[i]-'0'); i++; } char *pom=new char[i-j+1]; strncpy(pom,&string[j],i-j); pom[i-j]='0'; cifra.dodaj(broj(pom)); continue; } // mala slova if(string[i]>='a' && string[i]<='z') { slovo.dodaj(string[i]); i++; continue; } // velika slova if(string[i]>='A' && string[i]<='Z') { slovo.dodaj(string[i]); i++; continue; } i++; // sledeci karakter za obradu } cout<< "cifre: "<<cifra; cout<< "slova: "<<slovo; system("pause"); } Zbog cega mi stalno javlja gresku: In function `std::ostream& operator<<(std::ostream&, Skup<T, N>&)': invalid use of non-static data member `Skup<T, N>::n' from this location |