fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. class Base {
  7. public:
  8. static vector<Base *> all_objects_of_this_class_or_subclasses;
  9.  
  10. static void print_summary_of_objects(int step) {
  11. printf("В массиве указателей на шаге %d находится %d указателей\n", step, all_objects_of_this_class_or_subclasses.size());
  12. }
  13.  
  14. Base() {
  15. all_objects_of_this_class_or_subclasses.push_back(this);
  16. }
  17.  
  18. ~Base() {
  19. auto it = find(all_objects_of_this_class_or_subclasses.begin(), all_objects_of_this_class_or_subclasses.end(), this);
  20. all_objects_of_this_class_or_subclasses.erase(it);
  21. }
  22. };
  23.  
  24. vector<Base *> Base::all_objects_of_this_class_or_subclasses;
  25.  
  26. class Derived1 : public Base {
  27. // ...
  28. };
  29.  
  30. class Derived2 : public Base {
  31. // ...
  32. };
  33.  
  34. int main() {
  35. Base::print_summary_of_objects(0);
  36.  
  37. Base *base = new Base();
  38. Base::print_summary_of_objects(1);
  39.  
  40. Derived1 *derived1 = new Derived1();
  41. Base::print_summary_of_objects(2);
  42.  
  43. delete base;
  44. Base::print_summary_of_objects(3);
  45.  
  46. Derived2 *derived2 = new Derived2();
  47. Base::print_summary_of_objects(4);
  48.  
  49. delete derived2;
  50. Base::print_summary_of_objects(5);
  51.  
  52. delete derived1;
  53. Base::print_summary_of_objects(6);
  54. return 0;
  55. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
В массиве указателей на шаге 0 находится 0 указателей
В массиве указателей на шаге 1 находится 1 указателей
В массиве указателей на шаге 2 находится 2 указателей
В массиве указателей на шаге 3 находится 1 указателей
В массиве указателей на шаге 4 находится 2 указателей
В массиве указателей на шаге 5 находится 1 указателей
В массиве указателей на шаге 6 находится 0 указателей