Прежде всего, вы никогда не должны определять статическую глобальную переменную в заголовочном файле. Определение статической переменной вне класса имеет совершенно иной смысл, чем определение статической переменной внутри класса. Это очень запутанно, но так работает C ++.
В C ++ есть как минимум четыре варианта использования ключевого слова static:
1) Статическая глобальная переменная вне класса будет глобальной только для кода, который может напрямую «видеть» переменную, как правило, потому что они находятся в одном файле. Это делает переменную локальной для файла. Как уже упоминалось выше, вы не должны помещать один из них в заголовок. Если вы это сделаете, вы получите несколько экземпляров одной и той же переменной. По одному в каждом файле, который включает в себя заголовок. Изменения одного не повлияют на другие в других файлах.
2) Статическая глобальная функция имеет то же значение, что и статическая глобальная переменная в # 1. В общем, это означает, что функция будет вызываться только из файла, в котором она объявлена. Как и статическая глобальная переменная, если вы реализуете статическую глобальную функцию в заголовочном файле, вы получите несколько копий в конечном исполняемом файле. Однако, в отличие от статической глобальной переменной, если вы поместите статическую глобальную функцию определение в заголовочный файл, у вас будут проблемы с связыванием результирующих объектных файлов.
3) Статическая переменная в классе означает, что для всех экземпляров класса будет только одна копия этой переменной.
4) Статическая функция-член в классе будет иметь доступ только к статическим переменным в этом классе. Все остальные данные класса будут недоступны из статической функции-члена. Однако вы можете вызвать статическую функцию-член без экземпляра класса. например A::func()
.
Возможно, вы захотите либо использовать статическую переменную класса, либо поместить определение extern
в заголовочный файл, например так:
extern int arr[2][2];
Затем в файле реализации, где фактически создается экземпляр переменной, в виде нестатической переменной, например:
int arr[2][2] = {some values};
Убедитесь, что вы понимаете разницу между объявлением / определением и реализацией / реализацией. Это концепции хранения в C / C ++.