#include <iostream>
#include <memory>
int treasury = 1000000;
class Investment {
int value_;
public:
static const int MINIMUM = 25;
Investment() : value_(0) {}
virtual ~Investment() { }
void buy(int amount) { value_ += amount; }
static void seize(Investment *inv){
if(inv)
treasury += inv->value_;
delete inv;
}
};
class Bond : public Investment {
};
class Stock : public Investment {
};
std::shared_ptr<Investment> createInvestment(bool buy_stock) {
// Why bother with the deleter here:
//std::shared_ptr<Investment> inv(nullptr, Investment::seize);
// this works just as well:
std::shared_ptr<Investment> inv;
if (buy_stock) {
//inv = std::shared_ptr<Investment>(new Stock(), Investment::seize);
inv.reset(new Stock(), Investment::seize);
//inv.reset(new Stock()); // This seems to remove the existing deleter
} else {
inv.reset(new Bond(), Investment::seize);
}
inv->buy(Investment::MINIMUM);
return inv;
}
void playTheMarkets() {
std::shared_ptr<Investment> stocks(createInvestment(true));
std::shared_ptr<Investment> bonds(createInvestment(false));
}
int main() {
playTheMarkets();
std::cout << treasury << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKaW50IHRyZWFzdXJ5ID0gMTAwMDAwMDsKCmNsYXNzIEludmVzdG1lbnQgewoJaW50IHZhbHVlXzsKICBwdWJsaWM6CiAgICBzdGF0aWMgY29uc3QgaW50IE1JTklNVU0gPSAyNTsKICAKICAgIEludmVzdG1lbnQoKSA6IHZhbHVlXygwKSB7fQogICAgdmlydHVhbCB+SW52ZXN0bWVudCgpIHsgfQogICAgdm9pZCBidXkoaW50IGFtb3VudCkgeyB2YWx1ZV8gKz0gYW1vdW50OyB9CiAgICAKICAgIHN0YXRpYyB2b2lkIHNlaXplKEludmVzdG1lbnQgKmludil7CiAgICAJaWYoaW52KQogICAgCSAgdHJlYXN1cnkgKz0gaW52LT52YWx1ZV87CiAgICAJZGVsZXRlIGludjsKICAgIH0KfTsKCmNsYXNzIEJvbmQgOiBwdWJsaWMgSW52ZXN0bWVudCAgewp9OwoKY2xhc3MgU3RvY2sgOiBwdWJsaWMgSW52ZXN0bWVudCB7Cn07CgpzdGQ6OnNoYXJlZF9wdHI8SW52ZXN0bWVudD4gY3JlYXRlSW52ZXN0bWVudChib29sIGJ1eV9zdG9jaykgewogIC8vIFdoeSBib3RoZXIgd2l0aCB0aGUgZGVsZXRlciBoZXJlOgogIC8vc3RkOjpzaGFyZWRfcHRyPEludmVzdG1lbnQ+IGludihudWxscHRyLCBJbnZlc3RtZW50OjpzZWl6ZSk7CiAgCiAgLy8gdGhpcyB3b3JrcyBqdXN0IGFzIHdlbGw6CiAgc3RkOjpzaGFyZWRfcHRyPEludmVzdG1lbnQ+IGludjsKICAKICBpZiAoYnV5X3N0b2NrKSB7CiAgICAvL2ludiA9IHN0ZDo6c2hhcmVkX3B0cjxJbnZlc3RtZW50PihuZXcgU3RvY2soKSwgSW52ZXN0bWVudDo6c2VpemUpOwogICAgaW52LnJlc2V0KG5ldyBTdG9jaygpLCBJbnZlc3RtZW50OjpzZWl6ZSk7CiAgICAvL2ludi5yZXNldChuZXcgU3RvY2soKSk7IC8vIFRoaXMgc2VlbXMgdG8gcmVtb3ZlIHRoZSBleGlzdGluZyBkZWxldGVyCiAgfSBlbHNlIHsKICAJaW52LnJlc2V0KG5ldyBCb25kKCksIEludmVzdG1lbnQ6OnNlaXplKTsKICB9CiAgCiAgaW52LT5idXkoSW52ZXN0bWVudDo6TUlOSU1VTSk7CiAgCiAgcmV0dXJuIGludjsKfQoKdm9pZCBwbGF5VGhlTWFya2V0cygpIHsKICBzdGQ6OnNoYXJlZF9wdHI8SW52ZXN0bWVudD4gc3RvY2tzKGNyZWF0ZUludmVzdG1lbnQodHJ1ZSkpOyAKICBzdGQ6OnNoYXJlZF9wdHI8SW52ZXN0bWVudD4gYm9uZHMoY3JlYXRlSW52ZXN0bWVudChmYWxzZSkpOwkKfQoKaW50IG1haW4oKSB7CiAgcGxheVRoZU1hcmtldHMoKTsKICBzdGQ6OmNvdXQgPDwgdHJlYXN1cnkgPDwgc3RkOjplbmRsOwp9