#include <iostream>
#include <memory>
#include <string>
#include <ostream>
using namespace std;
class Thing {
private:
string name;
public:
Thing(): name() {
cout << "Creating anonymous thing" << endl;
}
Thing(string name): name(name) {
cout << "Creating thing " << name << endl;
}
~Thing() {
cout << "Destroying thing " << this->name << endl;
}
void setName(const string & name) {
this->name = name;
}
string getName() {
return this->name;
}
};
void swapThings(shared_ptr<Thing> & a, const shared_ptr<Thing> b) {
a->setName("foo");
a = b;
}
int main() {
auto a = make_shared<Thing>(Thing());
auto b = make_shared<Thing>(Thing("bar"));
swapThings(a, b);
cout << "a::name: " << a->getName() << endl;
cout << "b::name: " << b->getName() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8b3N0cmVhbT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBUaGluZyB7CiAgcHJpdmF0ZToKCXN0cmluZyBuYW1lOwoJCiAgcHVibGljOgogICAgVGhpbmcoKTogbmFtZSgpIHsKICAgIAljb3V0IDw8ICJDcmVhdGluZyBhbm9ueW1vdXMgdGhpbmciIDw8IGVuZGw7CiAgICB9CiAgICAKICAgIFRoaW5nKHN0cmluZyBuYW1lKTogbmFtZShuYW1lKSB7CiAgICAJY291dCA8PCAiQ3JlYXRpbmcgdGhpbmcgIiA8PCBuYW1lIDw8IGVuZGw7CiAgICB9CiAgICAKICAgIH5UaGluZygpIHsKICAgIAljb3V0IDw8ICJEZXN0cm95aW5nIHRoaW5nICIgPDwgdGhpcy0+bmFtZSA8PCBlbmRsOwogICAgfQogICAgCiAgICB2b2lkIHNldE5hbWUoY29uc3Qgc3RyaW5nICYgbmFtZSkgewogICAgCXRoaXMtPm5hbWUgPSBuYW1lOwogICAgfQogICAgCiAgICBzdHJpbmcgZ2V0TmFtZSgpIHsKICAgIAlyZXR1cm4gdGhpcy0+bmFtZTsKICAgIH0KfTsKCnZvaWQgc3dhcFRoaW5ncyhzaGFyZWRfcHRyPFRoaW5nPiAmIGEsIGNvbnN0IHNoYXJlZF9wdHI8VGhpbmc+IGIpIHsKCWEtPnNldE5hbWUoImZvbyIpOwoJYSA9IGI7Cn0KCmludCBtYWluKCkgewoJYXV0byBhID0gbWFrZV9zaGFyZWQ8VGhpbmc+KFRoaW5nKCkpOwoJYXV0byBiID0gbWFrZV9zaGFyZWQ8VGhpbmc+KFRoaW5nKCJiYXIiKSk7CgkKCXN3YXBUaGluZ3MoYSwgYik7CgkKCWNvdXQgPDwgImE6Om5hbWU6ICIgPDwgYS0+Z2V0TmFtZSgpIDw8IGVuZGw7Cgljb3V0IDw8ICJiOjpuYW1lOiAiIDw8IGItPmdldE5hbWUoKSA8PCBlbmRsOwoJCglyZXR1cm4gMDsKfQ==