#include <iostream>
#include <memory>
using namespace std;
class B; // <=== forward declare
class C {
public:
virtual B mymethod() const =0;
};
class A : public C {
public:
B mymethod() const override;
//private:
int myvar;
};
struct B {
std::shared_ptr<C> pointer;
};
B A::mymethod() const {
B instance;
instance.pointer = std::make_shared<A>(*this); //is this wrong?
return instance;
}
int main() {
A object;
object.myvar=27;
B instance = object.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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQjsgLy8gPD09PSBmb3J3YXJkIGRlY2xhcmUKY2xhc3MgQyB7CnB1YmxpYzoKICB2aXJ0dWFsIEIgbXltZXRob2QoKSBjb25zdCA9MDsKfTsKCmNsYXNzIEEgOiBwdWJsaWMgQyB7CnB1YmxpYzoKICBCIG15bWV0aG9kKCkgY29uc3Qgb3ZlcnJpZGU7Ci8vcHJpdmF0ZToKICBpbnQgbXl2YXI7Cn07CgpzdHJ1Y3QgQiB7CiAgc3RkOjpzaGFyZWRfcHRyPEM+IHBvaW50ZXI7Cn07CgpCIEE6Om15bWV0aG9kKCkgY29uc3QgewogIEIgaW5zdGFuY2U7CiAgaW5zdGFuY2UucG9pbnRlciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QT4oKnRoaXMpOyAgIC8vaXMgdGhpcyB3cm9uZz8KICByZXR1cm4gaW5zdGFuY2U7Cn0KaW50IG1haW4oKSB7CiAgQSBvYmplY3Q7CiAgb2JqZWN0Lm15dmFyPTI3OwogIEIgaW5zdGFuY2UgPSBvYmplY3QubXltZXRob2QoKTsKICAvL3N0ZDo6Y291dCA8PCBpbnN0YW5jZS5wb2ludGVyLT5teXZhcjsgICAvL0RPRVNOJ1QgQ09NUElMRTogQ0FOTk9UIERVTVAgISEKICBzdGQ6OmNvdXQgPDwgZHluYW1pY19wb2ludGVyX2Nhc3Q8QT4oaW5zdGFuY2UucG9pbnRlciktPm15dmFyPDxlbmRsOwogIGNvdXQ8PCBpbnN0YW5jZS5wb2ludGVyLnVzZV9jb3VudCgpPDxlbmRsOwoJcmV0dXJuIDA7Cn0=