2010-12-05 3 views
0

У меня есть два класса Person and Student. В настоящее время я пытаюсь получить класс Student из класса Person.Ошибка связи C++ Inheritance

Тем не менее, я продолжаю получать ссылку.

Ошибка:

[Linker error] undefined reference to `Person::Person()' 

Мой код:

#include <iostream> 
#include <iomanip> 
using namespace std; 

class Person { 

    string Name ; 

public: 
    Person(void); 

    void set(){ 

     cout << "Name:" << endl ; 
     cin >> Name ; 
     } 

    string get_Name(){ 
     return Name ; 
     } 


}; 

class Student:Person { 
    int x, Lab1, Lab2, Lab3, Lab4, Lab5, Lab6, LabPoints, Midterm, Final ; 
    float LabAvg, ExamAvg, Prcnt ; 
    string StuName ; 

public: 
    Student(void); 

    void set(int i){ 
     x = i; 

     cout << "Student " << x << endl << endl ; 
     cout << "Name:" << endl ; 
     cin >> StuName ; 
     cout << "Lab 1 score (1-10): " << endl ; 
     cin >> Lab1 ; 
     cout << "Lab 2 score (1-10): " << endl ; 
     cin >> Lab2 ; 
     cout << "Lab 3 score (1-10): " << endl ; 
     cin >> Lab3 ; 
     cout << "Lab 4 score (1-10): " << endl ; 
     cin >> Lab4 ; 
     cout << "Lab 5 score (1-10): " << endl ; 
     cin >> Lab5 ; 
     cout << "Lab 6 score (1-10): " << endl ; 
     cin >> Lab6 ; 
     cout << "Midterm score (1-100): " << endl ; 
     cin >> Midterm ; 
     cout << "Final score (1-100): " << endl ; 
     cin >> Final ; 

     LabAvg = (Lab1 + Lab2)/2.0 ; 
     LabPoints = (Lab1 + Lab2) ; 
     ExamAvg = (Midterm + Final)/2.0 ; 
     Prcnt = (((LabPoints/60.0) * 0.6) + ((Midterm/100.0) * 0.2) + 
     ((Final/100.0) * 0.2)) * 100 ; 

     } 

    string get_StuName(){ 
     return StuName ; 
     } 

    int get_Lab1(){ 
     return Lab1 ; 
     } 

    int get_Lab2(){ 
     return Lab2 ; 
     } 

    int get_Lab3(){ 
     return Lab3 ; 
     } 

    int get_Lab4(){ 
     return Lab4 ; 
     } 

    int get_Lab5(){ 
     return Lab5 ; 
     } 

    int get_Lab6(){ 
     return Lab6 ; 
     } 

    float get_LabAvg(){ 
     return LabAvg ; 
     } 

    int get_LabPoints(){ 
     return LabPoints ; 
     } 

    float get_ExamAvg(){ 
     return ExamAvg ; 
     } 

    float get_Prcnt(){ 
     return Prcnt ; 
     } 
}; 

Student::Student(void){ 
    x = 0, Lab1 = 0, Lab2 = 0, Lab3 = 0, Lab4 = 0, Lab5 = 0, Lab6 = 0, 
    LabPoints = 0, Midterm = 0, Final = 0 ; 
    LabAvg = 0.0, ExamAvg = 0.0, Prcnt = 0.0 ; 
    StuName = "" ; 
} 

int main(){ 
    int MaxNumStu = 10, NumOfRep , i ; 
    float FPrcnt ; 
    string LetGrd ; 

    cout << "Number of Students:" << endl ; 
    cin >> NumOfRep ; 
    cout << endl << endl ; 

    Student obs[MaxNumStu] ; 

    NumOfRep = ++NumOfRep ; 
    for(i=1 ; i < NumOfRep ; i++) 
    obs[i].set(i) ; 

    cout << endl << "---------------------------------" << endl << endl ; 

    for(i=1; i < NumOfRep; i++){ 
    cout << obs[i].get_StuName() << endl << endl; 
    cout << "Lab 1 Score: " << obs[i].get_Lab1() << endl ; 
    cout << "Lab 2 Score: " << obs[i].get_Lab2() << endl ; 
    cout << "Lab 3 Score: " << obs[i].get_Lab3() << endl ; 
    cout << "Lab 4 Score: " << obs[i].get_Lab4() << endl ; 
    cout << "Lab 5 Score: " << obs[i].get_Lab5() << endl ; 
    cout << "Lab 6 Score: " << obs[i].get_Lab6() << endl ; 
    cout << endl << "Average Lab Score: " << setprecision(4) << 
    obs[i].get_LabAvg() << endl ; 
    cout << "Total Lab Points: " << obs[i].get_LabPoints() << endl ; 
    cout << endl << "Average Exam Score: " << setprecision(4) << 
    obs[i].get_ExamAvg() << endl ; 

    FPrcnt = obs[i].get_Prcnt() ; 

    if (FPrcnt >= 90) 
     LetGrd = "% A" ; 
    if (FPrcnt >= 80) 
     if (FPrcnt < 90) 
      LetGrd = "% B" ; 
    if (FPrcnt >= 70) 
     if (FPrcnt < 80) 
      LetGrd = "% C" ; 
    if (FPrcnt >= 60) 
     if (FPrcnt < 70) 
      LetGrd = "% D" ; 
    if (FPrcnt < 60) 
     LetGrd = "% F"; 

    cout << endl << endl << "Overall Grade: " << setprecision(3) << FPrcnt 
    << LetGrd << endl; 
    cout << endl << endl ; 
    } 
    system("pause") ; 
} 

ответ

4

Вы объявили конструктор по умолчанию для Person:

public: 
    Person(void); 

Но никогда не определял его.

В этом случае вам не нужно иметь собственный конструктор по умолчанию - удалите объявление и дайте компилятору создать по умолчанию для вас. В качестве альтернативы, вы можете определить ничегонеделания:

Person::Person() 
{ 
} 
1

Вы объявляете Person :: Person() в строке 10, но вы никогда не определить.

3

Вы объявили Person::Person(void); без его определения.

Все будет в порядке, если вы удалите эту линию.

1

Этот вопрос связан с двумя основными понятиями C++: конструктор производного класса, компилятор генерируется функции-члены.

Для конструктора производного класса требуется сначала вызвать конструктор базового класса. В этом случае

Student::Student(void){ 
    x = 0, Lab1 = 0, Lab2 = 0, Lab3 = 0, Lab4 = 0, Lab5 = 0, Lab6 = 0, 
    LabPoints = 0, Midterm = 0, Final = 0 ; 
    LabAvg = 0.0, ExamAvg = 0.0, Prcnt = 0.0 ; 
    StuName = "" ; 
} 

В нем не указывается, какой конструктор класса используется человеком. Поэтому компилятор автоматически вставляет вызов конструктора по умолчанию класса Person, Person:Person().

Для компилятора функции, компилятор сгенерирует эти следующие функции-членов для каждого класса, если они не объявленных

  • Конструктор по умолчанию
  • Copy конструктор
  • Оператор присваивание
  • Destructor

Однако класс Person заявил конструктор Person:Person(void) так, что конструктор по умолчанию не будет сгенерирован компилятором. Когда дело доходит до ссылки Person:Person() для класса Student, ошибка ссылки генерируется компилятором.

Существует два решения для ошибки связи.

  1. стереть торможение Person::Person(void);, поэтому будет создан конструктор по умолчанию.
  2. добавить определение Person::Person(void);. Компонент будет использовать наш собственный конструктор по умолчанию.

Чтобы продлить действие, предположим, что конструктор, определенный в классе, является Person:Person(string name). Тогда решение 2 также должно изменить конструктор класса Student.

Student::Student(void):Person("any string"){ 
    x = 0, Lab1 = 0, Lab2 = 0, Lab3 = 0, Lab4 = 0, Lab5 = 0, Lab6 = 0, 
    LabPoints = 0, Midterm = 0, Final = 0 ; 
    LabAvg = 0.0, ExamAvg = 0.0, Prcnt = 0.0 ; 
    StuName = "" ; 
}