#include #include #include #include //------------------------------------------------------------------------------ // Apufunktioita merkkijonojen käsittelyyn //------------------------------------------------------------------------------ string erota(string &jono, char merkki=' ',bool etsi_takaperin=false) { size_t p; if ( !etsi_takaperin ) p = jono.find(merkki); else p = jono.rfind(merkki); string alku = jono.substr(0,p); if ( p == string::npos ) jono = ""; else jono.erase(0,p+1); return alku; } int erota_int(string &jono, char merkki=' ',bool etsi_takaperin=false) { string ijono(erota(jono,merkki,etsi_takaperin)); int i=0; sscanf(ijono.c_str(),"%d",&i); return i; } string AsString(int i) { char s[50]; sprintf(s,"%d",i); return string(s); } //------------------------------------------------------------------------------ class caElain { string nimi; int ika; string aantely; virtual const char *aanahdys() const { return ""; }; public: virtual caElain *luo_samanlainen(string &s) const { return NULL; }; ~caElain() { ika = -1; } virtual void setAsString(string &s) { nimi = erota(s,';'); ika = erota_int(s,';'); aantely = erota(s,';'); } virtual string getAsString() const { return nimi + ";" + AsString(ika) + ";" + aantely; } // caElain() { string s(""); setAsString(s); } caElain() { } caElain(string &s) { setAsString(s); } string aantelyAsString() const { if ( aantely != "" ) return aantely; else return aanahdys(); } void aantele(ostream &os=cout) const { os << aantelyAsString(); } }; class cKissa : public caElain { virtual const char *aanahdys() const { return "Miau"; } public: virtual caElain *luo_samanlainen(string &s) const { return new cKissa(s); } cKissa(string &s) : caElain(s) {} cKissa() : caElain() {} }; class cKoira : public caElain { virtual const char *aanahdys() const { return "Hau"; } public: virtual caElain *luo_samanlainen(string &s) const { return new cKoira(s); } cKoira(string &s) : caElain(s) {} }; class cMato : public caElain { int pituus; virtual const char *aanahdys() const { return "Siuh"; } public: virtual caElain *luo_samanlainen(string &s) const { return new cMato(s); } virtual void setAsString(string &s) { caElain::setAsString(s); pituus = erota_int(s); } // cMato(string &s) { setAsString(s); } // tai cMato(string &s) : caElain(s) { pituus = erota_int(s); } virtual string getAsString() const { return caElain::getAsString() + ";" + AsString(pituus); } }; //------------------------------------------------------------------------------ class cElainAlkio { caElain *elain; string viitenimi; public: cElainAlkio(const string &viite,caElain *e); // ~cElainAlkio() { delete elain; } int compare(const string s) const { return viitenimi.compare(s); } caElain *luo(string &s) const { return elain->luo_samanlainen(s); } }; class cKoe { caElain *elain; string viitenimi; public: cKoe(const string &viite,caElain *e) : elain(e) {} // ~cKoe() { delete elain; } }; class cElaintarhanElaimet { int lkm; int max_lkm; cElainAlkio **alkiot; public: cElaintarhanElaimet(int ml) { max_lkm = ml; lkm = 0; alkiot = new cElainAlkio *[ml]; } ~cElaintarhanElaimet() { delete alkiot; } int lisaa(cElainAlkio *uusi) { if ( lkm >= max_lkm ) return 1; alkiot[lkm] = uusi; lkm++; return 0; } cElainAlkio *etsi(const string &viitenimi) const; }; cElainAlkio *cElaintarhanElaimet::etsi(const string &viitenimi) const { for (int i=0; icompare(viitenimi) == 0 ) return alkiot[i]; return NULL; } //------------------------------------------------------------------------------ cElaintarhanElaimet gElaintarhanElaimet(20); cElainAlkio::cElainAlkio(const string &viite,caElain *e) : elain(e), viitenimi(viite) { gElaintarhanElaimet.lisaa(this); } string tyhja("Ei eläintä"); //cElainAlkio kissa("kissa",new cKissa(tyhja)); //cElainAlkio kissa1("kissa",new cKissa(tyhja)); cElainAlkio kissa("kissa",new cKissa(tyhja)); cElainAlkio kissa1("kissa",new cKissa(tyhja)); cElainAlkio kissa5("kissa",new cKissa(tyhja)); cElainAlkio kissa6("kissa",new cKissa(tyhja)); cKoe kissa3("kissa",new caElain); cKoe kissa4("kissa",new caElain); //cElainAlkio kissa2("kissa",new cKissa(tyhja)); //cElainAlkio koira("koira",new cKoira(tyhja)); //cElainAlkio mato("mato",new cMato(tyhja)); //------------------------------------------------------------------------------ class cElaintarha { int lkm; int max_lkm; caElain **alkiot; public: cElaintarha(int ml) { max_lkm = ml; lkm = 0; alkiot = new caElain *[ml]; } ~cElaintarha() { delete alkiot; } int lisaa(caElain *uusi) { if ( lkm >= max_lkm ) return 1; alkiot[lkm] = uusi; lkm++; return 0; } void tulosta(ostream &os) const; void aantele(ostream &os) const; int lue(istream &f); int lue(const string &tiedoston_nimi) { ifstream f(tiedoston_nimi.c_str()); if ( !f ) return 1; return lue(f); } }; void cElaintarha::tulosta(ostream &os=cout) const { for (int i=0; igetAsString() << endl; } void cElaintarha::aantele(ostream &os=cout) const { for (int i=0; iaantelyAsString() << " "; os << endl; } int cElaintarha::lue(istream &f) { string s,luokka; while ( !f.eof() ) { if ( !getline(f,s) ) return 1; luokka = erota(s,':'); cElainAlkio *ea = gElaintarhanElaimet.etsi(luokka); if ( !ea ) continue; lisaa(ea->luo(s)); } return 0; } //------------------------------------------------------------------------------ int main(void) { /* string s1("Misse;15;Miauuu"); cKissa misse(s1); string s2("Mirri;6"); cKissa mirri(s2); string s3("Musti;3"); cKoira musti(s3); string s4("Mato Matala;5;;45"); cMato matala(s4); cout << misse.getAsString() << " " << misse.aantelyAsString() << endl; cout << mirri.getAsString() << " " << mirri.aantelyAsString() << endl; cout << matala.getAsString() << " " << matala.aantelyAsString() << endl; */ #if 0 cElaintarha elaintarha(20); elaintarha.lue("elukat.txt"); elaintarha.tulosta(); elaintarha.aantele(); #endif return 0; }