#include <iostream>
#include <memory>
using namespace std;
class Foo : public enable_shared_from_this<Foo>
{
Foo() = default;
/*should be virtual ?????*/
~Foo()
{
cout << "des" << endl;
}
public:
static shared_ptr<Foo> Create() {
class PrivateFoo : public Foo { /*empty*/ };
return std::make_shared<PrivateFoo>();
}
void Test()
{
auto sp = shared_from_this();
cout << sp.use_count() <<endl;
}
};
int main()
{
auto f = Foo::Create();
f->Test();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjbGFzcyBGb28gOiBwdWJsaWMgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Rm9vPgp7CiAgRm9vKCkgPSBkZWZhdWx0OwogIC8qc2hvdWxkIGJlIHZpcnR1YWwgPz8/Pz8qLwogIH5Gb28oKQogIHsKICAgIGNvdXQgPDwgImRlcyIgPDwgZW5kbDsKICB9CiAgCgpwdWJsaWM6CiAgCiAgc3RhdGljIHNoYXJlZF9wdHI8Rm9vPiBDcmVhdGUoKSB7CiAgICBjbGFzcyBQcml2YXRlRm9vIDogcHVibGljIEZvbyB7IC8qZW1wdHkqLyB9OwogICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8UHJpdmF0ZUZvbz4oKTsKICB9CiAgdm9pZCBUZXN0KCkKICB7CiAgICBhdXRvIHNwID0gc2hhcmVkX2Zyb21fdGhpcygpOwogICAgY291dCA8PCBzcC51c2VfY291bnQoKSA8PGVuZGw7CiAgfQp9OwoKaW50IG1haW4oKQp7CiAgYXV0byBmID0gRm9vOjpDcmVhdGUoKTsKICBmLT5UZXN0KCk7CiAgCiAgcmV0dXJuIDA7Cn0K