Статическая переменная для подсчета объектов в классах 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 члены класса должны быть определены (и потенциально инициализированы) в области пространства имен, правила доступа к членам не применяются.