fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. template<typename T>
  5. struct Holder {
  6. Holder() {
  7. std::cout << "Holder()::Holder()" << std::endl;
  8. if (!Self) Self = new T();
  9. Self->Init();
  10. }
  11. ~Holder() {
  12. if (Self) {
  13. Self->Cleanup();
  14. delete Self;
  15. std::cout << "~Holder()::Holder()" << std::endl;
  16. }
  17. }
  18. T* Self = nullptr;
  19. };
  20.  
  21.  
  22. ////////////////////////////////////////////////////////////////////////////////////////
  23.  
  24. template <typename T>
  25. class Singleton {
  26. public:
  27. static T* Instance() {
  28. std::cout << "Singlton::Instance()" << std::endl;
  29. static Holder<T> Dummy;
  30. return Dummy.Self;
  31. }
  32. private:
  33. Singleton() = delete;
  34. Singleton(Singleton const&) = delete;
  35. Singleton& operator= (Singleton const&) = delete;
  36. Singleton(Singleton const&&) = delete;
  37. Singleton& operator= (Singleton const&&) = delete;
  38. };
  39.  
  40. class SomeClass
  41. {
  42. public:
  43. void Init()
  44. {
  45. connect();
  46. initialize();
  47. }
  48.  
  49. void Cleanup()
  50. {
  51. disconnect();
  52. }
  53.  
  54. void connect()
  55. {
  56. std::cout << "connect" << std::endl;
  57. }
  58.  
  59. void disconnect()
  60. {
  61. std::cout << "disconnect" << std::endl;
  62. }
  63.  
  64. void initialize()
  65. {
  66. std::cout << "initialize" << std::endl;
  67. throw "Aaaaaaaaaaaaaaaaa";
  68. }
  69. int member;
  70. };
  71.  
  72. int main()
  73. {
  74. {
  75. auto pInst = Singleton<SomeClass>::Instance();
  76. pInst->member = 10;
  77. std::cout << pInst->member << std::endl;
  78. }
  79. auto pInst = Singleton<SomeClass>::Instance();
  80. pInst->member = 20;
  81.  
  82. return 0;
  83. }
Runtime error #stdin #stdout #stderr 0s 15240KB
stdin
Standard input is empty
stdout
Singlton::Instance()
Holder()::Holder()
connect
initialize
stderr
terminate called after throwing an instance of 'char const*'