#include <iostream>
#include <memory>
using namespace std;
class B; // <=== forward declare
class C : public std::enable_shared_from_this<C> { // inherit publicly
public:
virtual B mymethod() =0;
virtual ~C() {} // Attention: polymorphic class needs virtual destructor
};
class A : public C {
public:
B mymethod() override;
//private:
int myvar;
};
struct B {
std::shared_ptr<C> pointer;
};
B A::mymethod() {
B instance;
//instance.pointer = std::shared_ptr<A>(this); //<===== no longer
instance.pointer = shared_from_this(); //<===== RETURN A POINTER TO SELF
return instance;
}
int main() {
shared_ptr<C> pobject(new A);
dynamic_pointer_cast<A>(pobject)->myvar=27; // just for verification
B instance = pobject->mymethod();
//std::cout << instance.pointer->myvar; //DOESN'T COMPILE: CANNOT DUMP !!
std::cout << dynamic_pointer_cast<A>(instance.pointer)->myvar<<endl;
cout<< instance.pointer.use_count()<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQjsgLy8gPD09PSBmb3J3YXJkIGRlY2xhcmUKY2xhc3MgQyA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEM+IHsgIC8vIGluaGVyaXQgcHVibGljbHkgCnB1YmxpYzoKICB2aXJ0dWFsIEIgbXltZXRob2QoKSAgPTA7CiAgdmlydHVhbCB+QygpIHt9ICAgIC8vIEF0dGVudGlvbjogIHBvbHltb3JwaGljIGNsYXNzIG5lZWRzIHZpcnR1YWwgZGVzdHJ1Y3Rvcgp9OwoKY2xhc3MgQSA6IHB1YmxpYyBDIHsKcHVibGljOgogIEIgbXltZXRob2QoKSAgb3ZlcnJpZGU7Ci8vcHJpdmF0ZToKICBpbnQgbXl2YXI7Cn07CgpzdHJ1Y3QgQiB7CiAgc3RkOjpzaGFyZWRfcHRyPEM+IHBvaW50ZXI7Cn07CgpCIEE6Om15bWV0aG9kKCkgIHsKICBCIGluc3RhbmNlOwogIC8vaW5zdGFuY2UucG9pbnRlciA9IHN0ZDo6c2hhcmVkX3B0cjxBPih0aGlzKTsgICAvLzw9PT09PSBubyBsb25nZXIgCiAgaW5zdGFuY2UucG9pbnRlciA9IHNoYXJlZF9mcm9tX3RoaXMoKTsgIC8vPD09PT09IFJFVFVSTiBBIFBPSU5URVIgVE8gU0VMRgogIHJldHVybiBpbnN0YW5jZTsKfQppbnQgbWFpbigpIHsKICBzaGFyZWRfcHRyPEM+IHBvYmplY3QobmV3IEEpOwogIGR5bmFtaWNfcG9pbnRlcl9jYXN0PEE+KHBvYmplY3QpLT5teXZhcj0yNzsgLy8ganVzdCBmb3IgdmVyaWZpY2F0aW9uCiAgQiBpbnN0YW5jZSA9IHBvYmplY3QtPm15bWV0aG9kKCk7CiAgLy9zdGQ6OmNvdXQgPDwgaW5zdGFuY2UucG9pbnRlci0+bXl2YXI7ICAgLy9ET0VTTidUIENPTVBJTEU6IENBTk5PVCBEVU1QICEhCiAgc3RkOjpjb3V0IDw8IGR5bmFtaWNfcG9pbnRlcl9jYXN0PEE+KGluc3RhbmNlLnBvaW50ZXIpLT5teXZhcjw8ZW5kbDsKICBjb3V0PDwgaW5zdGFuY2UucG9pbnRlci51c2VfY291bnQoKTw8ZW5kbDsKCXJldHVybiAwOwp9