三行代码  ›  专栏  ›  技术社区  ›  Rocket Procd

获取活动类实例的数量

  •  1
  • Rocket Procd  · 技术社区  · 2 月前

    我需要获得创建的数量和活动类实例的数量。

    #include <iostream>
    #include <stdexcept>
    class Set {
      double value;
      int created = 0;
      int active = 0;
    public:
      Set();
      Set(double num);
      static int NumberOfCreated();
      static int NumberOfActive();
    };
    Set::Set() : value(0) {}
    Set::Set(double num) : value(num) {
      created++;
      active++;
    }
    int Set::NumberOfCreated() { return created; }
    int Set::NumberOfActive() { return active; }
    int main() {
      Set s1, s2(100);
      { Set s3(50); }                      // After "}", "s3" doesn't exist anymore
      std::cout << Set::NumberOfCreated(); // Should print 3
      std::cout << Set::NumberOfActive();  // Should print 2
      return 0;
    }
    

    我有两个错误:

    在静态成员函数中无效地使用了成员–Set::created–of

    静态成员函数中成员集::active的使用无效

    此外,对于活动类实例和创建的类实例,此逻辑始终提供相同的输出。你能给我一个更好的方法来找到活跃元素的数量吗?

    • 注: main 无法更改功能!只有更改类才能启用此功能。
    3 回复  |  直到 2 月前
        1
  •  3
  •   Anoop Rana    2 月前

    这个 问题 我们不能使用非静态数据成员 created active 从内部 static 成员函数 Numberof Created NumberOfActive

    解决 你可以做这个 已创建 忙碌的 静态,也可以使用析构函数进行减量 忙碌的 如下所示:

    class Set {
          double value;
          //static data members 
          inline static int created = 0;
          inline static int active = 0;
      public:
          //static member functions 
          static int NumberOfCreated();
          static int NumberOfActive();
    public:
      Set();
      Set(double num);
      //declaration for destructor 
      ~Set();
     
    };
    
    Set::Set() : value(0) {
        ++created;
        ++active;
        
    }
    Set::Set(double num) : value(num) {
      created++;
      active++;
    }
    //implementation for destructor
    Set::~Set()
    {
        //decrement active 
        --active;
    }
    int Set::NumberOfCreated() { return created; }
    int Set::NumberOfActive() { return active; }
    int main() {
      Set s1, s2(100);
      { Set s3(50); }                      
      std::cout << Set::NumberOfCreated()<<std::endl; // print 3
      std::cout << Set::NumberOfActive()<<std::endl;  //prints 2
      return 0;
    }
    

    上述程序的输出为:

    3
    2
    

    Working Demo

        2
  •  3
  •   user17732522    2 月前

    你需要 created active 未来 static 数据成员,因为它们应该描述程序的全局状态,而不是类实例的单个状态。

    然后,在每个(非委托)构造函数中,包括以其他方式隐式定义且不会正确计数的复制/移动构造函数,您将需要递增它们。在析构函数中,你应该减少 忙碌的 因为如果一个对象的生命周期结束,您可能会认为它是非活动的。

    还请注意,通过重用对象的存储,可以在不调用其析构函数的情况下结束对象的生存期。然后 忙碌的 计数器无法正确记帐。如果正确使用该类,通常不会发生这种情况。

    如果有多个线程,则需要将互斥体添加为 静止的 在写入或读取两个计数器或使计数器 std::atomic 变量。

    您还需要添加溢出检查,并决定发生这种情况时要做什么,因为溢出 int 将导致未定义的行为。

        3
  •  2
  •   Iłya Bursov    2 月前

    您有多个问题,下面是如何解决的方法,请查看备注:

    #include <iostream>
    #include <stdexcept>
    
    class Set {
      double value;
      static int created; // you need single variable for all instances, this is why static
      static int active;
    public:
      Set();
      Set(double num);
      ~Set() {
          --active; // destructor is called when object is destroyed, so number of active instances is decreased
      }
      static int NumberOfCreated();
      static int NumberOfActive();
    };
    
    int Set::created = 0;
    int Set::active = 0;
    
    Set::Set() : Set(0) {} // this constructor should increase created/active counters as well, this can be achieved via calling another ctor
    Set::Set(double num) : value(num) {
      created++;
      active++;
    }
    int Set::NumberOfCreated() { return created; }
    int Set::NumberOfActive() { return active; }
    
    int main() {
      Set s1, s2(100);
      { Set s3(50); }
      std::cout << Set::NumberOfCreated() << std::endl;
      std::cout << Set::NumberOfActive() << std::endl;
      return 0;
    }
    

    当然,请关注@user17732522关于复制/移动和线程安全的评论