Статическая переменная для подсчета объектов в классах c ++? - PullRequest
10 голосов
/ 16 октября 2011

Я бы хотел, чтобы статическая переменная-член отслеживала количество созданных объектов.Вот так:

class test{
    static int count = 0;
    public:
        test(){
            count++;

        }
}

Это не работает, потому что, согласно VC ++, a member with an in-class initializer must be constant.Итак, я оглянулся и, видимо, вы должны сделать:

test::count = 0;

Это было бы здорово, но я хочу, чтобы count был приватным.

edit: Ohмальчик, я только что понял, что мне нужно сделать:

int test::count = 0;

Я видел, что что-то просто делает test::count = 0, поэтому я предположил, что вам не придется снова объявлять type.

I 'Хотелось бы узнать, есть ли способ сделать это внутри класса.

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 ]

13 голосов
/ 16 октября 2011

Положите

static int count;

В своем заголовке в определении класса и

int test::count = 0;

В файле .cpp.Он по-прежнему будет закрытым (если вы оставите объявление в заголовке в закрытом разделе класса).

Причина, по которой вам это нужно, заключается в том, что static int count является объявлением переменной, но вам нужно определение водин исходный файл, чтобы компоновщик знал, в какую область памяти вы ссылаетесь, когда используете имя test::count.

3 голосов
/ 05 марта 2016

Инициализация статической переменной внутри функции разрешена, поэтому решение может быть примерно таким:

 class test
 {
    private:
    static int & getCount ()
    {
       static int theCount = 0;
       return theCount;
    }
    public:
    int totalCount ()
    {
       return getCount ();
    }

    test()
    {      
       getCount () ++;
    }
 };

В целом, используя эту технику, можно обойти ограничение C ++, касающееся инициализации статического члена в объявлении.

1 голос
/ 16 октября 2011

static члены класса должны быть определены (и потенциально инициализированы) в области пространства имен, правила доступа к членам не применяются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...