2016-06-03 18 views
0

Ich versuche, den folgenden Code auszuführen, aber es stürzt ab, sobald das Objekt der geerbten Klasse erstellt wird.Segmentierungsfehler C++ verursacht Absturz des Programms

Das Programm funktioniert bis zur Erstellung des geerbten Klassenobjekts, aber der Segmentierungsfehler tritt auf, nachdem die Zeile "Student * s" ausgeführt wurde.

Hier ist der Code:

#include <iostream> 
#include <vector> 

using namespace std; 

class Person 
{ 
protected: 
    string firstName; 
    string lastName; 
    int id; 
public: 
    Person(string firstName, string lastName, int identification) 
    { 
     this->firstName = firstName; 
     this->lastName = lastName; 
     this->id = identification; 
    } 
    void printPerson() 
    { 
     cout << "Name: " << lastName << ", " << firstName << "\nID: " << id 
       << "\n"; 
    } 

}; 

class Student: public Person 
{ 
private: 
    vector<int> testScores; 
public: 
    Student(string f, string l, int i, vector<int>& scores) : 
      Person(firstName, lastName, id) 
    { 
     this->firstName = f; 
     this->lastName = l; 
     this->id = i; 
     this->testScores = scores; 
    } 

    char calculate() 
    { 
     vector<int>::iterator it; 
     int sum = 0; 
     for (it = testScores.begin(); it != testScores.end(); it++) 
     { 
      sum += *it; 
     } 
     int avg = sum/(testScores.size()); 
     if (avg >= 90 && avg <= 100) 
      return 'O'; 
     else if (avg >= 80 && avg < 90) 
      return 'E'; 
     else if (avg >= 70 && avg < 80) 
      return 'A'; 
     else if (avg >= 55 && avg < 70) 
      return 'P'; 
     else if (avg >= 40 && avg < 55) 
      return 'D'; 
     else 
      return 'T'; 

    } 
}; 

int main() 
{ 
    string firstName; 
    string lastName; 
    int id; 
    int numScores; 
    cin >> firstName >> lastName >> id >> numScores; 
    vector<int> scores; 
    for (int i = 0; i < numScores; i++) 
    { 
     int tmpScore; 
     cin >> tmpScore; 
     scores.push_back(tmpScore); 
    } 
    cout << "Calling\n"; 
    Student* s = new Student(firstName, lastName, id, scores); 
    cout << "Done\n"; 
    s->printPerson(); 
    cout << "Grade: " << s->calculate() << "\n"; 
    return 0; 
} 
+0

Ich bekomme nicht die 'Student (Zeichenfolge f, String l, int ich, Vektor & Scores): Person (Vorname, Nachname, ID)' Anweisung. Was möchten Sie erreichen, indem Sie die nicht initialisierten Datenelemente an den Basisklassenkonstruktor senden? –

+0

'Student * s = neuer Student (firstName, lastName, id, scores);' scheint keine dynamische Zuweisung zu erfordern und es gibt kein passendes 'delete', um' Student' freizugeben. – user4581301

Antwort

1
Student(string f, string l, int i, vector<int>& scores) : 
      Person(firstName, lastName, id) 

verwendet Person den eigenen firstName, lastName und id Mitglieder Person zu konstruieren. Dies kann oder kann nicht segfault und boom gehen, aber geht definitiv in undefiniertes Verhalten.

OP will mehr etwas wie diese, wo die übergebenen Parameter verwendet werden statt:

Student(string f, string l, int i, vector<int>& scores) : 
      Person(f, l, i) 
    { 
     // all of the members that were set here don't need to be set. 
     // Person did it already 
     this->testScores = scores; 
    } 

Eine weitere Verbesserung erzielt werden kann. testScores kann mit the member initializer list initialisiert werden. Dies ermöglicht scores sofort in testScores gestopft werden und der Compiler kann alle Arten von interessanten Optimierungen vornehmen.

Student(string f, string l, int i, vector<int>& scores) : 
      Person(f, l, i), testScores(scores) 
    { 
    } 

Wo möglich initialisieren Sie Elementvariablen in der Initialisierungsliste. `Person kann auch verbessert werden:

Person(string first, string last, int identification): 
     firstName(first), 
     lastName(last), 
     id(identification) 
    { 
    } 

Nun ist die Division durch Null durch Rakete1111 der Fehler entdeckt gefunden und fixiert werden.

+0

Immer noch kein Fortschritt ... Das Programm stürzt immer noch – Aditya

+0

@Aditya Das sollte funktionieren. Für welche Eingabe stürzte das Programm ab? –

+0

@Aditya Zusätzlich zu dem leeren Vektor-Problem @ Rakete1111 entdeckt, ist alle Ihre IO deaktiviert, so dass es viel Platz für schlechte Eingaben gibt. Zum Beispiel bringt die Eingabe von "a b c 1 1" 'cin' in einen Fehlerzustand, weil" c "keine gültige ganze Zahl ist. Dies wird nicht abgefangen, daher wird 'Student s' mit nicht definierter Eingabe erstellt. Niemand kann sagen, was dann passieren wird. – user4581301

Verwandte Themen