Если вы запустили его без прикрепленного отладчика, тем меньше потоков. И это, по-видимому, будет нить финализатора и другие материалы CLR для домашнего хозяйства.
Объявление класса должно быть в заголовочном файле (Или в исходном файле если не совместно использовано).
Файл: foo.h
class foo
{
private:
static int i;
};
, Но инициализация должен быть в исходном файле.
Файл: foo.cpp
int foo::i = 0;
, Если инициализация находится в заголовочном файле тогда каждый файл, который включает заголовочный файл, будет иметь определение статического участника. Таким образом во время фазы ссылки Вы получите ошибки компоновщика, поскольку код для инициализации переменной будет определен в нескольких исходных файлах.
Примечание: Matt Curtis: указывает, что C++ позволяет упрощение вышеупомянутого, если статическая членская переменная имеет тип интервала константы (например, int
, bool
, char
). Можно тогда объявить и инициализировать членскую переменную непосредственно в объявлении класса в заголовочном файле:
class foo
{
private:
static int const i = 42;
};
int foo::i = 0;
правильный синтаксис для инициализации переменной, но это должно войти в исходный файл (.cpp), а не в заголовке.
, поскольку это - статическая переменная, компилятор должен создать только одну копию его. У Вас должна быть строка "интервал foo:i" некоторые, где в Вашем коде для сообщения компилятора, куда поместить его иначе, Вы получаете ошибку ссылки. Если это будет в заголовке, то Вы получите копию в каждом файле, который включает заголовок, поэтому доберитесь, умножают определенные ошибки символа от компоновщика.
С компилятором Microsoft [1], статические переменные, которые не являются int
- как, могут также быть определены в заголовочном файле, но за пределами объявления класса, с помощью Microsoft, конкретной __declspec(selectany)
.
class A
{
static B b;
}
__declspec(selectany) A::b;
Примечание, что я не говорю это, хорошо, я просто говорю, что оно может быть сделано.
[1] В эти дни, больше компиляторов, чем поддержка MSC __declspec(selectany)
- по крайней мере, gcc и лязг. Возможно, еще больше.
Для переменная :
foo.h:
class foo
{
private:
static int i;
};
foo.cpp:
int foo::i = 0;
Это вызвано тем, что может только быть один экземпляр foo::i
в Вашей программе. Это - вид эквивалента extern int i
в заголовочном файле и int i
в исходном файле.
Для постоянный можно поместить значение прямо в объявление класса:
class foo
{
private:
static int i;
const static int a = 42;
};