How to declare a variable in a class that will track the count of objects created? example Object obj; obj.object_count();
            Asked
            
        
        
            Active
            
        
            Viewed 483 times
        
    1 Answers
2
            
            
        You can store the object count using a static class member. And increase its value in class constructors, decrease its value in destructor.
Please find comments inline:
#include <iostream>
#include <atomic>
class Object
{
public:
    Object()    // Constructor
    {
        // initialize the object
        // ...
        m_objCount++;   // Increase object count when creating object (In constructor)
    }
    Object(const Object& obj)   // Copy constructor
    {
        m_objCount++;
    }
    Object(Object&&) // Move constructor
    {
        m_objCount++;
    }
    ~Object()
    {
        m_objCount--;   // Decrease object count when destroying object
    }
    static int object_count()   // Define a static member function to retrive the count
    {
        return m_objCount;
    }
private:
    static std::atomic_int m_objCount;  // Use static member to store object count, 
                                        // use std::atomic_int to make sure it is thread safe
};
std::atomic_int Object::m_objCount; // Initialize static member
int main()
{
    Object obj;
    // prints "obj count: 1"
    std::cout << "obj count: " << obj.object_count() << std::endl;          // call object_count() with object
    std::cout << "obj count: " << Object::object_count() << std::endl;      // call object_count() with class name
}
 
    
    
        zhm
        
- 3,513
- 3
- 34
- 55
- 
                    1You also need to allow for the copy constructor and move constructor. It would be good for OP to wrap this logic up in a class so that users of it can still follow Rule of Zero – M.M Jun 08 '18 at 02:46
- 
                    Since `object_count()` is `static`, you can call it using the class type instead of an object variable: `fprintf(stdout, "obj count: %d\n", Object::object_count());` And why are you using `fprintf()` in C++ instead of using `std::cout`? `std::cout << "obj count: " << Object::object_count() << std:::endl;` – Remy Lebeau Jun 08 '18 at 02:48
- 
                    
- 
                    
- 
                    @AlanBirtles Do you really think we need to consider multi-threading in this question? – zhm Jun 08 '18 at 06:03
- 
                    @zhm yes, someone who doesn't know what they're doing is likely to stumble across this question and answer then wonder why they get strange results – Alan Birtles Jun 08 '18 at 06:07
- 
                    
 
    