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