#include <iostream>
#include <memory>
class Base {
public:
Base(const std::shared_ptr<int>& sd) : shared_data_{sd} { }
int& GetData() const { return *shared_data_; }
private:
std::shared_ptr<int> shared_data_;
};
class C1 : public Base {
public:
C1(const std::shared_ptr<int>& sd) : Base{sd} {}
};
class C2 : public Base {
public:
C2(const std::shared_ptr<int>& sd) : Base{sd} {}
};
class Factory {
public:
Factory() : shared_data_{std::make_shared<int>(42)} {}
C1 CreateC1() const { return C1(shared_data_); }
C2 CreateC2() const { return C2(shared_data_); }
private:
std::shared_ptr<int> shared_data_;
};
int main() {
Factory f;
C1 c1 = f.CreateC1();
C2 c2 = f.CreateC2();
std::cout << "C1: " << c1.GetData() << std::endl;
std::cout << "C2: " << c2.GetData() << std::endl;
c1.GetData() = 10;
std::cout << "C1: " << c1.GetData() << std::endl;
std::cout << "C2: " << c2.GetData() << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKY2xhc3MgQmFzZSB7CnB1YmxpYzoKCUJhc2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIHNkKSA6IHNoYXJlZF9kYXRhX3tzZH0geyB9CglpbnQmIEdldERhdGEoKSBjb25zdCB7IHJldHVybiAqc2hhcmVkX2RhdGFfOyB9Cgpwcml2YXRlOgoJc3RkOjpzaGFyZWRfcHRyPGludD4gc2hhcmVkX2RhdGFfOwp9OwoKY2xhc3MgQzEgOiBwdWJsaWMgQmFzZSB7CnB1YmxpYzoKCUMxKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBzZCkgOiBCYXNle3NkfSB7fQp9OwoKY2xhc3MgQzIgOiBwdWJsaWMgQmFzZSB7CnB1YmxpYzoKCUMyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBzZCkgOiBCYXNle3NkfSB7fQp9OwoKY2xhc3MgRmFjdG9yeSB7CnB1YmxpYzoKCUZhY3RvcnkoKSA6IHNoYXJlZF9kYXRhX3tzdGQ6Om1ha2Vfc2hhcmVkPGludD4oNDIpfSB7fQoJCglDMSBDcmVhdGVDMSgpIGNvbnN0IHsgcmV0dXJuIEMxKHNoYXJlZF9kYXRhXyk7IH0KCUMyIENyZWF0ZUMyKCkgY29uc3QgeyByZXR1cm4gQzIoc2hhcmVkX2RhdGFfKTsgfQpwcml2YXRlOgoJc3RkOjpzaGFyZWRfcHRyPGludD4gc2hhcmVkX2RhdGFfOwp9OwoKCmludCBtYWluKCkgewoJRmFjdG9yeSBmOwoJCglDMSBjMSA9IGYuQ3JlYXRlQzEoKTsKCUMyIGMyID0gZi5DcmVhdGVDMigpOwoJCglzdGQ6OmNvdXQgPDwgIkMxOiAiIDw8IGMxLkdldERhdGEoKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgIkMyOiAiIDw8IGMyLkdldERhdGEoKSA8PCBzdGQ6OmVuZGw7CgkKCWMxLkdldERhdGEoKSA9IDEwOwoJCglzdGQ6OmNvdXQgPDwgIkMxOiAiIDw8IGMxLkdldERhdGEoKSA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgIkMyOiAiIDw8IGMyLkdldERhdGEoKSA8PCBzdGQ6OmVuZGw7CgkKCQoJcmV0dXJuIDA7Cn0=