У вас объявлено этих переменных, но вы не определили их. Итак, вы сказали компилятору: «Где-то у меня будет переменная с этим именем, поэтому, когда я использую это имя, не думайте о неопределенных переменных, пока вы не поищите везде определение». 1
В файле .cpp
добавить определения:
int Student::_avrA; // _avrA is now 0*
int Student::_avrB = 1; // _avrB is now 1
int Student::_avrC = 0; // _avrC is now 0
int Student::_avrD = 2; // _avrD is now 2
Не делайте этого в файле .h
, потому что если вы дважды включите его в два разных файла .cpp
, вы получите несколько ошибок определения, поскольку компоновщик увидит более одного файла, пытающегося создать переменную с именем Student::_avrA
, Student::_avbB
и т. Д. И в соответствии с правилом Единого определения для всех них это незаконно.
1 Очень похоже на прототип функции. В вашем коде все выглядит так, как будто у вас есть прототип функции, но нет тела.
* Потому что «статические целочисленные члены классов гарантированно будут инициализированы нулем при отсутствии явного инициализатора». (TonyK)