/* D227.CPP M 2.27 */ // Esimerkki Operaatoreiden uudelleen m„„rit„misest„. // Huomatus! Esimerkkin operattorit eiv„t muodosta aina // kunnon "algebraa" #include #include #define I_IP // Jos halutaan erikseen muoto j=i+p #define P_P // Jos halutaan sijoitus p3 = p2 #define I_P // Jos halutaan muunnos p -> int #define D_P // jos halutaan muunnos p -> double class piste { int x,y; public: void tulosta() {printf("(%d,%d)\n",x,y);} void aseta(int nx,int ny) { x=nx; y=ny;} piste(int ix=0, int iy=0) { aseta(ix,iy); } piste operator+(piste &p2); // p3 = p1 + p2, vrt. p3 = +(p1,p2) piste operator-(piste &p2); // p3 = p1 - p2; piste &operator=(int i); // p = i; #ifdef P_P piste &operator=(piste &p2); // p3 = p2; #endif piste &operator++(); // ++p piste &operator++(int i); // p++ (i=0) piste &operator+=(int i); // p += 5; #ifdef I_IP friend int operator+(int i, piste &p); // i = 5 + p; #endif #ifdef D_P operator double() {return sqrt(x*x+y*y);} // d = p; #endif #ifdef I_P operator int() {return x;} // i = p; #endif friend piste fabs(const piste &p); // p1 = fabs(p2); int operator==(piste &p2) // if ( p1 == p2 ) ... { return ( this->x == p2.x && this->y == p2.y ); } }; piste piste::operator+(piste &p2) { piste t; t.x = x + p2.x; t.y = y + p2.y; return t; } piste piste::operator-(piste &p2) { piste t; t.x = x - p2.x; t.y = y - p2.y; return t; } piste &piste::operator=(int i) // Ei mielek„s! { x = i; y = i; return *this; } #ifdef P_P piste &piste::operator=(piste &p2) { x = p2.x; y = p2.y; return *this; } #endif // Ei mielek„s! piste &piste::operator++() // ++p { x++; y++; return *this; } piste &piste::operator++(int i) // p++ // Ei mielek„s! { #pragma argsused x++; y++; return *this; } piste &piste::operator+=(int i) // Ei mielek„s! { x+=i; y+=i; return *this; } #ifdef I_IP int operator+(int i, piste &p) { // J„rkev„mpi olisi tietenkin return i+(int)p mutta se tulisi // automaattisesti jos on operator int() return i+p.x; } #endif piste fabs(const piste &p) // p1 = fabs(p2); { return piste(fabs(p.x),fabs(p.y)); } int main(void) { piste p1(2,2),p2(1,4),p3; p3 = p1 + p2; p3.tulosta(); // (3,6) p3 = p3 - p1; p3.tulosta(); // (1,4) p2.tulosta(); // (1,4) p3 = p1; // Alkio kerrallaan sijoitus p3.tulosta(); // (2,2) p3 = 9; // Jollei olisi = -m„„rityst„, kutsuisi // rakentajaa, jolle kelpaa kutsu piste(9) p3.tulosta(); // (9,9) ++p2; p2.tulosta(); // (2,5) p2++; p2.tulosta(); // (3,6) p2+=4; p2.tulosta(); // (7,10) p2 = fabs(p1); // d = fabs(d2); #if defined(I_IP)+defined(I_P)+defined(D_P) int i; i = 4+p2; // Ilman friend-funktiota ei saisi n„in p„in printf ("i=%d\n",i); // 11 (tai 16 jos ei muotoa j=i+p ja d=p on) i = p3; // printf ("i=%d\n",i); // 9 double d = p3; printf ("d=%3.2lf\n",d); // 12.73 #endif p1 = p2; if ( p1 == p2 ) printf("Jippii"); p1++; if ( p1 == p2 ) printf("Jippii"); return 0; }