[ 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

[ svrle @ 17.01.2010. 17:47 ] @
U for petlji operatora << treba umesto uslova i<n staviti i<skup.n