Инициализация static-переменной класса для подсчёта количества вызовов метода
Есть некоторый класс, в котором нужно подсчитать число вызовов конструктора копирования. У этого класса есть ещё два дочерних, в которых тоже нужно подсчитывать это же число. Необходимо использовать static-переменную для подсчёта вызовов.
Думаю, что static-переменная должна находится в protected-части базового класса, чтобы её могли унаследовать два производных. При этом столкнулся с проблемой: как инициализировать эту переменную (нулём), чтобы далее её увеличивать при каждом вызове конструктора?
Ответы (2 шт):
Так:
test.hpp
class Test
{
protected:
inline static int counter = 0;
};
Либо так:
test.hpp
class Test
{
protected:
static int counter;
};
test.cpp
int Test::counter = 0;
При таком подходе:
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";