#include #include #include #include #include using namespace std; class Complex { private: double real; double imaginary; public: Complex(); Complex(double r, double i); Complex* add(Complex* c2); Complex* sub(Complex* c2); Complex* sub2(Complex & c2); Complex* mul(Complex* c2); void print(); }; Complex::Complex() { real=0.0; imaginary=0.0; } Complex::Complex(double r, double i) { real=r; imaginary=i; } Complex* Complex::add(Complex* c2) { assert(c2!=NULL); Complex* result=new Complex(real+c2->real,imaginary+c2->imaginary); // Point 1 return result; } Complex* Complex::sub(Complex* c2) { assert(c2!=NULL); Complex* result=new Complex(real-c2->real,imaginary-c2->imaginary); return result; } Complex* Complex::sub2(Complex & c2) { Complex* result=new Complex(real-c2.real,imaginary-c2.imaginary); // Point 2 return result; } Complex* Complex::mul(Complex* c2) { assert(c2!=NULL); Complex* result=new Complex( real*c2->real - imaginary*c2->imaginary, real*c2->imaginary + imaginary*c2->real); return result; } void Complex::print() { cout << real<<" + "<add(c2); } else if (op==SUB) { return c1->sub(c2); } else { assert(op==MUL); return c1->mul(c2); } } Complex* process2(Complex* c1, Complex* c2, int op) { assert(c1!=NULL); assert(c2!=NULL); assert(op>=ADD && op<=MUL); static Complex* (Complex::*a[3])(Complex*)={ &Complex::add,&Complex::sub,&Complex::mul}; Complex* (Complex::*op_func)(Complex*)=a[op]; return (c1->*op_func)(c2); } double bad_multiply(int i1, int i2) { return (double)(i1*i2); } int main() { Complex a(1.0,2.0); Complex &ref=a; Complex* p0=new Complex(0.0,0.1); // Point 0 Complex b(2.0,3.0); Complex c(5.0,4.0); Complex d(3.0,8.0); Complex* p1=a.add(&b); Complex* p2=c.sub2(d); Complex* p3=d.sub(&a); Complex* p4=process(&a,&b,MUL); Complex* p5=process2(&a,&b,MUL); Complex e(*p4); p1->print(); p2->print(); p3->print(); p4->print(); p5->print(); e.print(); delete p1; p1=NULL; delete p2; p2=NULL; return 0; }