fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. class Base {
  5. public:
  6. Base(const std::shared_ptr<int>& sd) : shared_data_{sd} { }
  7. int& GetData() const { return *shared_data_; }
  8.  
  9. private:
  10. std::shared_ptr<int> shared_data_;
  11. };
  12.  
  13. class C1 : public Base {
  14. public:
  15. C1(const std::shared_ptr<int>& sd) : Base{sd} {}
  16. };
  17.  
  18. class C2 : public Base {
  19. public:
  20. C2(const std::shared_ptr<int>& sd) : Base{sd} {}
  21. };
  22.  
  23. class Factory {
  24. public:
  25. Factory() : shared_data_{std::make_shared<int>(42)} {}
  26.  
  27. C1 CreateC1() const { return C1(shared_data_); }
  28. C2 CreateC2() const { return C2(shared_data_); }
  29. private:
  30. std::shared_ptr<int> shared_data_;
  31. };
  32.  
  33.  
  34. int main() {
  35. Factory f;
  36.  
  37. C1 c1 = f.CreateC1();
  38. C2 c2 = f.CreateC2();
  39.  
  40. std::cout << "C1: " << c1.GetData() << std::endl;
  41. std::cout << "C2: " << c2.GetData() << std::endl;
  42.  
  43. c1.GetData() = 10;
  44.  
  45. std::cout << "C1: " << c1.GetData() << std::endl;
  46. std::cout << "C2: " << c2.GetData() << std::endl;
  47.  
  48.  
  49. return 0;
  50. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
C1: 42
C2: 42
C1: 10
C2: 10