Влияет на порядок инициализации в C ++ - PullRequest
0 голосов
/ 21 мая 2018

Читая книгу " Мышление на Java ", я обнаружил, что эта строка

C ++, например, имеет проблем , если одна статическая ожидает другую статическуючтобы быть действительным до инициализации второго

Впоследствии я попытался установить себя с помощью ниже кода :

class A{
    public:
        static int x;
};
int A::x = B::y; //error 'B' has not been declared
class B{
    public:
        static int y;
};
int B::y = 10;
int main()
{
    return 0;
}

Мой вопрос заключается в том, что тамспособ преодолеть эту проблему.Java решает эту проблему, загружая код класса при обращении к статическому полю / методу.Как мы это делаем в C ++?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Ответ - нет, вам нужно инициализировать статические переменные-члены в правильном порядке.

Если они являются постоянными, вы можете напрямую инициализировать их в классе.

0 голосов
/ 21 мая 2018

Вы должны поставить инициализацию A::x после определения B, который должен быть полным типом для использования B::y;и после инициализации B::y, потому что A::x инициализируется из него.

например,

class B{
    public:
        static int y;
};
int B::y = 10;

class A{
    public:
        static int x;
};
int A::x = B::y;

Порядок инициализации определяется следующим образом:

Упорядоченная динамическая инициализация, которая применяется ко всем другим нелокальным переменным: в пределах одной единицы преобразования инициализация этих переменных всегда выполняется в точном порядке, в котором их определения появляются в исходном коде.Инициализация статических переменных в разных единицах перевода выполняется неопределенным образом.Инициализация локальных переменных потока в разных единицах перевода не выполняется.

...