/* Teht„v„ 2.19 C++ -toteutus Lis„tty luokka cNelio. Lis„tty my”s luokka cVari. KuvioJollaSade perit„„n nyt sek„ caKuviosta ett„ cVarista. Koska kallistus tarvitsi vain yhden attribuutin (kallistuskulma) lis„sin sen suoraan KuvioJollaSade-luokan attribuutiksi. */ #include //---------------------------------------------------------------------------- class caKuvio { int nakyy; // Sytytetty vai sammutettu void vaihda_paikka(int nx,int ny) { x = nx; y = ny; } protected: // Jos halutaan peri„ luokkaa, pit„„ j„lkel„isten int x,y; // k„ytt””n sallittujen attrib. olla protected public: caKuvio(int ix=0, int iy=0) { vaihda_paikka(ix,iy); nakyy = 0; } virtual ~caKuvio() { } int nakyvissa() const { return nakyy; } virtual void piirra() const = 0; // Pure virtual-metodi => abstr. luokka void sammuta() { if ( nakyvissa() ) { nakyy = 0; piirra(); }} void sytyta() { if ( !nakyvissa() ) { nakyy = 1; piirra(); }} void siirra(int nx, int ny) { if ( !nakyvissa() ) { vaihda_paikka(nx,ny); return; } sammuta(); vaihda_paikka(nx,ny); sytyta(); } virtual void tulosta(const char *s="") const { printf("%-10s: %-10s (%02d,%02d)",nakyy?"Sytytetty":"Sammutettu",s,x,y); } }; // caKuvio //---------------------------------------------------------------------------- class cVari { int r, g, b; public: cVari(int ir=0, int ig=0, int ib=0) { r = ir; g = ig; b = ib; } virtual void piirra() const {printf(" V„ri: %02x%02x%02x", r, g, b); } int onko_musta() { if (r==0 && g==0 && b==0) return 1; return 0; } }; //---------------------------------------------------------------------------- class caKuvioJollaSade : public caKuvio , public cVari { // ????? int koko(int nr) { r = nr; return 0; } protected: int r; // Uusi atribuutti, koko double kallistus; public: caKuvioJollaSade(int ix=0,int iy=0,int ir=1, int red=0, int green=0, int blue=0, double ikall=0.0) : caKuvio(ix,iy), cVari(red, green, blue), r(ir), kallistus(ikall) {} void muuta_koko(int nr) { // Uutena ominaisuutena koon muuttaminen if ( !nakyvissa() ) { koko(nr); return; } sammuta(); koko(nr); sytyta(); } // void kierra(??) { } virtual void tulosta(const char *s="") const { caKuvio::tulosta(s); printf( " r=%d",r); if (kallistus != 0) printf( " Kallistuskulma: %.2lf", kallistus); if (!cVari::onko_musta()) cVari::piirra(); } }; // caKuvioJollaSade //---------------------------------------------------------------------------- class cPiste : public caKuvio { public: cPiste(int ix=0, int iy=0) : caKuvio(ix,iy) {} virtual ~cPiste() { sammuta(); } virtual void piirra() const { tulosta("Piste"); printf("\n"); } }; // cPiste //---------------------------------------------------------------------------- class cYmpyra : public caKuvioJollaSade { public: // cYmpyra(int ix=0, int iy=0, int ir=1) cYmpyra(int ix=0, int iy=0, int ir=1, int red=0, int green=0, int blue=0) : caKuvioJollaSade(ix,iy,ir, red, green, blue, 0) {} virtual ~cYmpyra() { sammuta(); } virtual void piirra() const { tulosta("Ympyra"); printf("\n"); } }; // cYmpyra //---------------------------------------------------------------------------- class cNelio : public caKuvioJollaSade { public: // cNelio(int ix=0, int iy=0, int ir=1, double kall=0, int red=0, int green=0, int blue=0) : cNelio(int ir=1, double kall=0, int red=0, int green=0, int blue=0) : caKuvioJollaSade(0, 0, ir, red, green, blue, kall) {} virtual ~cNelio() { sammuta(); } virtual void piirra() const { tulosta("Nelio"); printf("\n"); } }; // cNelio //---------------------------------------------------------------------------- int main(void) { printf("-------------------------------------------------\n"); cPiste p1,p2(10,20); cYmpyra y1(1, 1, 2, 255, 255, 0); y1.sytyta(); cNelio n1(3, 45, 255, 0, 0); cNelio n2(3, 62.5); n1.sytyta(); n2.sytyta(); return 0; }