// file my_complex.h
class my_complex
{
public:
my_complex(double r, double i);
double& real() { return r; }
double& imaginary() { return i; }
my_complex& add(double r, double i);
my_complex& operator++();
my_complex operator++(int);
private:
double r;
double i;
};
// file my_complex.cpp
//#include "my_complex.h"
my_complex::my_complex(double r, double i) : r(r), i(i) { }
// returns reference the original object
my_complex& my_complex::add(double r, double i) {
this->r += r;
this->i += i;
return *this;
}
// returns reference to the original (incremented) object
my_complex& my_complex::operator++() {
r += 1;
return *this;
}
// returns value with copy of the temporary object before incrementation
my_complex my_complex::operator++(int) {
my_complex orig(*this);
r += 1;
return orig;
}
// file main.cpp
int main()
{
my_complex c(6, 5); // default ctor
double i = c.imaginary(); // copy returned reference
c.real() = 8; // modify through returned reference
++(c.add(3, 4)); // chaining function calls on 'c'
my_complex d = c++; // copy returned value
return 0;
}
Ly8gZmlsZSBteV9jb21wbGV4LmgKY2xhc3MgbXlfY29tcGxleAp7CnB1YmxpYzoKICBteV9jb21wbGV4KGRvdWJsZSByLCBkb3VibGUgaSk7CgogIGRvdWJsZSYgcmVhbCgpICAgICAgeyByZXR1cm4gcjsgfQogIGRvdWJsZSYgaW1hZ2luYXJ5KCkgeyByZXR1cm4gaTsgfQogIG15X2NvbXBsZXgmIGFkZChkb3VibGUgciwgZG91YmxlIGkpOwogIG15X2NvbXBsZXgmIG9wZXJhdG9yKysoKTsKICBteV9jb21wbGV4ICBvcGVyYXRvcisrKGludCk7CnByaXZhdGU6CiAgZG91YmxlIHI7CiAgZG91YmxlIGk7Cn07CgovLyBmaWxlIG15X2NvbXBsZXguY3BwCi8vI2luY2x1ZGUgIm15X2NvbXBsZXguaCIKCm15X2NvbXBsZXg6Om15X2NvbXBsZXgoZG91YmxlIHIsIGRvdWJsZSBpKSA6IHIociksIGkoaSkgeyB9CgovLyByZXR1cm5zIHJlZmVyZW5jZSB0aGUgb3JpZ2luYWwgb2JqZWN0Cm15X2NvbXBsZXgmIG15X2NvbXBsZXg6OmFkZChkb3VibGUgciwgZG91YmxlIGkpIHsKICB0aGlzLT5yICs9IHI7CiAgdGhpcy0+aSArPSBpOwogIHJldHVybiAqdGhpczsKfQoKLy8gcmV0dXJucyByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIChpbmNyZW1lbnRlZCkgb2JqZWN0Cm15X2NvbXBsZXgmIG15X2NvbXBsZXg6Om9wZXJhdG9yKysoKSB7CiAgciArPSAxOwogIHJldHVybiAqdGhpczsKfQoKLy8gcmV0dXJucyB2YWx1ZSB3aXRoIGNvcHkgb2YgdGhlIHRlbXBvcmFyeSBvYmplY3QgYmVmb3JlIGluY3JlbWVudGF0aW9uCm15X2NvbXBsZXggIG15X2NvbXBsZXg6Om9wZXJhdG9yKysoaW50KSB7CiAgbXlfY29tcGxleCBvcmlnKCp0aGlzKTsKICByICs9IDE7CiAgcmV0dXJuIG9yaWc7Cn0KCi8vIGZpbGUgbWFpbi5jcHAKaW50IG1haW4oKQp7CiAgbXlfY29tcGxleCBjKDYsIDUpOyAgICAgICAvLyBkZWZhdWx0IGN0b3IKICBkb3VibGUgaSA9IGMuaW1hZ2luYXJ5KCk7IC8vIGNvcHkgcmV0dXJuZWQgcmVmZXJlbmNlCiAgYy5yZWFsKCkgPSA4OyAgICAgICAgICAgICAvLyBtb2RpZnkgdGhyb3VnaCByZXR1cm5lZCByZWZlcmVuY2UKICArKyhjLmFkZCgzLCA0KSk7ICAgICAgICAgIC8vIGNoYWluaW5nIGZ1bmN0aW9uIGNhbGxzIG9uICdjJwogIG15X2NvbXBsZXggZCA9IGMrKzsgICAgICAgLy8gY29weSByZXR1cm5lZCB2YWx1ZQogIHJldHVybiAwOwp9