Статическая переменная для подсчета объектов в классах c ?

#c #class #static

#c #класс #статический

Вопрос:

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

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

        }
}
  

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

 test::count = 0;
  

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

редактировать: О боже, я только что понял, что мне нужно сделать:

 int test::count = 0;
  

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

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

правка2:

Что я использую:

 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 ';'?)

правка3:

Да, забыл точку с запятой после определения класса. Я не привык к тому, чтобы это делать.

Комментарии:

1. Вы забыли завершить свое определение класса с помощью ;

Ответ №1:

Поместить

 static int count;
  

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

 int test::count = 0;
  

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

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

Комментарии:

1. Теперь он говорит: 'test' followed by 'int' is illegal (did you forget a ';'?)

2. @Walkerneo вставьте написанный вами код. Обратите внимание, что заголовок должен оставаться таким же, как и раньше, за исключением удаления = 0 .

3. Кстати, все это в одном файле, я их не разделял. Это проблема?

4. @Walkerneo если все это находится в одном файле, то вы должны убедиться, что ваш файл включен только один раз во весь ваш проект. Если она включена более одного раза, вы получите ошибку множественного определения. И чтобы уточнить, int test::count = 0 должно быть вне определения класса.

5. @Walkerneo и ты забыл ; в конце своего класса.

Ответ №2:

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

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

    test()
    {      
       getCount ()   ;
    }
 };
  

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

Ответ №3:

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