fork download
  1. #include <iostream>
  2.  
  3. // Version 1: (return type fixed)
  4.  
  5. class Complex1 {
  6. friend std::ostream& operator << (std::ostream &out, const Complex1 &c);
  7. private:
  8. int a;
  9. public:
  10. explicit Complex1(int a): a(a) { }
  11. // operator + as member
  12. Complex1 operator + (const Complex1 &c) const
  13. {
  14. return Complex1(a + c.a);
  15. }
  16. };
  17.  
  18. std::ostream& operator << (std::ostream &out, const Complex1 &c)
  19. {
  20. return out << c.a;
  21. }
  22.  
  23. // Version 2: (two overloaded operators)
  24.  
  25. class Complex2 {
  26. friend std::ostream& operator << (std::ostream &out, const Complex2 &c);
  27. friend int operator+(const Complex2 &c, const Complex2 &d);
  28. friend int operator+(int c, const Complex2 &d);
  29. private:
  30. int a;
  31. public:
  32. explicit Complex2(int a): a(a) { }
  33.  
  34. };
  35.  
  36. std::ostream& operator << (std::ostream &out, const Complex2 &c)
  37. {
  38. return out << c.a;
  39. }
  40.  
  41. int operator+(const Complex2 &c, const Complex2 &d)
  42. {
  43. return c.a + d.a;
  44. }
  45.  
  46. int operator+(int c, const Complex2 &d)
  47. {
  48. return c + d.a;
  49. }
  50.  
  51. // Version 3: (implicit conversion with constructor)
  52.  
  53. class Complex3 {
  54. friend std::ostream& operator << (std::ostream &out, const Complex3 &c);
  55. private:
  56. int a;
  57. public:
  58. Complex3(int a): a(a) { }
  59. // operator + as member
  60. int operator+(const Complex3 &c) const
  61. {
  62. return a + c.a;
  63. }
  64. };
  65.  
  66. std::ostream& operator << (std::ostream &out, const Complex3 &c)
  67. {
  68. return out << c.a;
  69. }
  70.  
  71. // Check everything out:
  72.  
  73. using namespace std;
  74.  
  75. int main()
  76. {
  77. cout << "Version 1:" << endl;
  78. { Complex1 c1(3), c2(5), c3(2);
  79. Complex1 c4 = c1 + c2 + c3;
  80. cout << "c4: " << c4 << endl;
  81. }
  82. cout << "Version 2:" << endl;
  83. { Complex2 c1(3), c2(5), c3(2);
  84. Complex2 c4 = Complex2(c1 + c2 + c3);
  85. cout << "c4: " << c4 << endl;
  86. }
  87. cout << "Version 3:" << endl;
  88. { Complex1 c1(3), c2(5), c3(2);
  89. Complex1 c4 = c1 + c2 + c3;
  90. cout << "c4: " << c4 << endl;
  91. }
  92. cout << "done." << endl;
  93. return 0;
  94. }
  95.  
Success #stdin #stdout 0s 16048KB
stdin
Standard input is empty
stdout
Version 1:
c4: 10
Version 2:
c4: 10
Version 3:
c4: 10
done.