Неопределенная ссылка C ++ - PullRequest
2 голосов
/ 07 сентября 2011

У меня есть файл Student.h, который имеет статические целые числа следующим образом:

    class Student
{
public:
    static int _avrA,_avrB,_avrC,_avrD;
};

, и у меня есть University.h, который наследует Student.h.При реализации University.cpp одна из функций возвращает:

return (_grade_average*(Student::_avrA/Student::_avrB))+7;

, и компилятор пишет:

неопределенная ссылка на Student :: _ avrA.

Знаете ли вы, почему это происходит?

Ответы [ 2 ]

9 голосов
/ 07 сентября 2011

У вас объявлено этих переменных, но вы не определили их. Итак, вы сказали компилятору: «Где-то у меня будет переменная с этим именем, поэтому, когда я использую это имя, не думайте о неопределенных переменных, пока вы не поищите везде определение». 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)

2 голосов
/ 07 сентября 2011

Вам необходимо определить членов статических данных, а также их объявление. В вашей реализации Student.cpp добавьте следующие определения:

int Student::_avrA;
int Student::_avrB;
int Student::_avrC;
int Student::_avrD;
...