Инициализация static-переменной класса для подсчёта количества вызовов метода

Есть некоторый класс, в котором нужно подсчитать число вызовов конструктора копирования. У этого класса есть ещё два дочерних, в которых тоже нужно подсчитывать это же число. Необходимо использовать static-переменную для подсчёта вызовов.
Думаю, что static-переменная должна находится в protected-части базового класса, чтобы её могли унаследовать два производных. При этом столкнулся с проблемой: как инициализировать эту переменную (нулём), чтобы далее её увеличивать при каждом вызове конструктора?


Ответы (2 шт):

Автор решения: Egorithm

Так:

test.hpp

class Test
{
protected:
    inline static int counter = 0;
};

Либо так:

test.hpp

class Test
{
protected:
    static int counter;
};

test.cpp

int Test::counter = 0;
→ Ссылка
Автор решения: AR Hovsepyan

При таком подходе:

class Base {
protected:
    static int nc;
public:
    Base() = default;
    Base(const Base&) { ++nc; }    
};
int Base::nc;

struct D1 : Base {    
    D1() = default;
    D1(const D1&) { ++nc; }
};


struct D2 : Base {    
    D2() = default;
    D2(const D2&) { ++nc; }
};

Вы не узнаете сколько раз были вызваны конструкторы копирования производных классов, потому что для всех будет только информация о том, сколько раз был вызван конструктор копирования базового класса. Правильнее, чтобы каждый класс(структура) имел свой счетчик:

struct Base {
    static int nc;
    Base() = default;
    Base(const Base&) { ++nc; }    
};
int Base::nc;

struct D1 : Base {
    static int nc;
    D1() = default;
    D1(const D1&) { ++nc; ++Base::nc; }
};
int D1::nc;

struct D2 : Base {
    static int nc;
    D2() = default;
    D2(const D2&) { ++nc; ++Base::nc; }
};
int D2::nc;

Тогда у нас будет полная информация о вызовах:

Base b;    
D1 d1;
D2 d2;
Base{ b }; //одна копия Base
D1{ d1 }, D1{ d1 }; //две копии
D2{ d2 }; // одна копия  D2
cout << Base::nc << "  копий базового класса\n"
     << D1::nc  << "  копий D1\n"
     << D2::nc  << "  копий D2\n";
→ Ссылка