Ошибка соединения C ++ Наследование - PullRequest
0 голосов
/ 06 декабря 2010

У меня есть два класса Персона и Студент.В настоящее время я пытаюсь извлечь класс Student из класса Person.

Тем не менее, я получаю ошибку ссылки.

Ошибка:

[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 ]

4 голосов
/ 06 декабря 2010

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

public: 
  Person(void);

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

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

Person::Person()
{
}
3 голосов
/ 06 декабря 2010

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

С вами все будет в порядке, если вы удалите эту строку.

1 голос
/ 09 июня 2014

Этот вопрос связан с двумя фундаментальными концепциями 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:Person().

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

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

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

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

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

Для расширения давайте предположим, что конструктор, определенный в классе person, равен 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 = "" ;
}
1 голос
/ 06 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...