/* OPERATOR.CPP */ // Esimerkki Operaatoreiden lis„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 cPaikka { int x,y; public: void tulosta() const {printf("(%d,%d)\n",x,y);} void aseta(int nx,int ny) { x=nx; y=ny;} cPaikka(int ix=0, int iy=0) { aseta(ix,iy); } cPaikka operator+(cPaikka &p2); // p3 = p1 + p2, vrt. p3 = +(p1,p2) cPaikka operator-(cPaikka &p2); // p3 = p1 - p2; // cPaikka &operator=(int i); // p = i; #ifdef P_P cPaikka &operator=(cPaikka &p2); // p3 = p2; #endif cPaikka &operator++(); // ++p cPaikka &operator++(int i); // p++ (i=0) cPaikka &operator+=(int i); // p += 5; #ifdef I_IP friend int operator+(int i, cPaikka &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 }; cPaikka cPaikka::operator+(cPaikka &p2) { cPaikka t; t.x = x + p2.x; t.y = y + p2.y; return t; } cPaikka cPaikka::operator-(cPaikka &p2) { cPaikka t; t.x = x - p2.x; t.y = y - p2.y; return t; } #ifdef P_I cPaikka &cPaikka::operator=(int i) { x = i; y = 0; return *this; } #endif #ifdef P_P cPaikka &cPaikka::operator=(cPaikka &p2) { x = p2.x; y = p2.y; return *this; } #endif cPaikka &cPaikka::operator++() // ++p { x++; return *this; } cPaikka &cPaikka::operator++(int i) // p++ { #pragma argsused x++; return *this; } cPaikka &cPaikka::operator+=(int i) { x += i; return *this; } #ifdef I_IP int operator+(int i, cPaikka &p) { // J„rkev„mpi olisi tietenkin return i+(int)p mutta se tulisi // automaattisesti jos on operator int() return i + p.x; } #endif int main(void) { cPaikka 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 cPaikka(9) p3.tulosta(); // (9,0) ++p2; p2.tulosta(); // (2,5) p2++; p2.tulosta(); // (3,6) p2+=4; p2.tulosta(); // (7,10) #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 return 0; }