Статическая переменная для подсчета объектов в классах c++?
Я хотел бы, чтобы статическая переменная-член отслеживала количество объектов, которые были сделаны. Вот так:
class test{
static int count = 0;
public:
test(){
count++;
}
}
это не работает, потому что, согласно VC++,a member with an in-class initializer must be constant
. Поэтому я огляделся и, по-видимому, вы должны были сделать:
test::count = 0;
что было бы здорово, но я хочу, чтобы граф был частным.
edit: О боже, я только что понял, что мне нужно сделать:
int test::count = 0;
Я видел, как что-то просто делает test::count = 0
, так что я предполагалось, что вам не придется снова объявлять тип.
Я хотел бы знать, если есть способ сделать это внутри класса.
edit2:
что я использую:
class test{
private:
static int count;
public:
int getCount(){
return count;
}
test(){
count++;
}
}
int test::count=0;
теперь он говорит: 'test' followed by 'int' is illegal (did you forget a ';'?)
edit3:
да, забыл точку с запятой после определения класса. Я не привык к этому.
3 ответов
поставить
static int count;
в заголовке в определении класса, и
int test::count = 0;
в рамках .файл cpp. Он по-прежнему будет закрытым (если вы оставите объявление в заголовке в закрытом разделе класса).
причина, по которой вам это нужно, потому что static int count
является объявлением переменной, но вам нужно определение в одном исходном файле, чтобы компоновщик знал, на какое место памяти вы ссылаетесь при использовании имени test::count
.
инициализация статической переменной в функции разрешена, поэтому решение может быть чем-то вроде этого
class test
{
private:
static int & getCount ()
{
static int theCount = 0;
return theCount;
}
public:
int totalCount ()
{
return getCount ();
}
test()
{
getCount () ++;
}
};
В общем, используя этот метод, можно обойти ограничение C++ относительно статической инициализации члена в объявлении.
static
члены класса должны быть определены (и потенциально инициализированы) в области пространства имен, правила доступа к членам не применяются.