Как инициализировать частные статические члены в C ++?

Если вы запустили его без прикрепленного отладчика, тем меньше потоков. И это, по-видимому, будет нить финализатора и другие материалы CLR для домашнего хозяйства.

469
задан Ciro Santilli 新疆改造中心996ICU六四事件 20 March 2018 в 21:27
поделиться

4 ответа

Объявление класса должно быть в заголовочном файле (Или в исходном файле если не совместно использовано).
Файл: 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;
};
503
ответ дан Martin York 20 March 2018 в 21:27
поделиться
int foo::i = 0; 

правильный синтаксис для инициализации переменной, но это должно войти в исходный файл (.cpp), а не в заголовке.

, поскольку это - статическая переменная, компилятор должен создать только одну копию его. У Вас должна быть строка "интервал foo:i" некоторые, где в Вашем коде для сообщения компилятора, куда поместить его иначе, Вы получаете ошибку ссылки. Если это будет в заголовке, то Вы получите копию в каждом файле, который включает заголовок, поэтому доберитесь, умножают определенные ошибки символа от компоновщика.

16
ответ дан David Dibben 20 March 2018 в 21:27
поделиться

С компилятором Microsoft [1], статические переменные, которые не являются int - как, могут также быть определены в заголовочном файле, но за пределами объявления класса, с помощью Microsoft, конкретной __declspec(selectany).

class A
{
    static B b;
}

__declspec(selectany) A::b;

Примечание, что я не говорю это, хорошо, я просто говорю, что оно может быть сделано.

[1] В эти дни, больше компиляторов, чем поддержка MSC __declspec(selectany) - по крайней мере, gcc и лязг. Возможно, еще больше.

19
ответ дан Johann Gerell 20 March 2018 в 21:27
поделиться

Для переменная :

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;
};
85
ответ дан Matt Curtis 20 March 2018 в 21:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: