2016-04-26 14 views
-2

Kürzlich in meiner C++ - Klasse haben wir über Zeiger und Klassen gelernt.Klassenzeiger unitialisierte lokale Variable

Ich versuche ein Programm zu erstellen, das eine class Student hat, die wir zeigen werden, um jedem Schüler einen Namen und Testergebnis zu geben.

Nachdem sowohl der Name als auch die Testergebnisse eingegeben wurden, werden sie sortiert und in der Reihenfolge von der höchsten zur niedrigsten aufgelistet.

Ich glaube, dass meine ganze Syntax korrekt ist, aber ich lerne immer noch. Das Problem, das ich habe, ist, dass ich beim ersten Mal, wenn ich meine Klasse benutze, einen nicht initialisierten lokalen Variablenfehler bekomme, jede Hilfe, wie ich das beheben kann?

struct Student { 
    double score; 
    std::string name; 
}; 

Da die Accessoren absolut nichts zu tun:

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include <array> 
using namespace std; 

class Student { 
private: 
    double score; 
    string name; 
public: 
    void setScore(double a) { 
     score = a; 
    } 
    double getScore() { 
     return score; 
    } 
    void setName(string b) { 
     name = b; 
    } 
    string getName() { 
     return name; 
    } 
}; 

void sorting(Student*, int); 

int main() 
{ 
    Student *students; 
    string name; 
    int score; 
    int *count; 
    count = new int; 
    cout << "How many students? "; 
    cin >> *count; 
    while (*count <= 0) { 
     cout << "ERROR: The number of students must be greater than 0.\n"; 
     cin >> *count; 
    } 
    for (int i = 0; i < *count; i++) { 
     cout << "Please enter the students name: "; 
     cin >> name; 
     students[i].setName(name); 
     cout << "Please enter " << students[i].getName() << "'s score: "; 
     cin >> score; 
     while (score < 0) { 
      cout << "ERROR: Score must be a positive number.\n"; 
      cin >> score; 
     } 
     students[i].setScore(score); 
    } 
    sorting(students, *count); 
    for (int i = 0; i < *count; i++) { 
     cout << students[i].getName() << ": " << students[i].getScore() << endl; 
    } 
    system("PAUSE"); 
    return 0; 
} 

void sorting(Student *s, int size) { 
    for (int i = 0; i < size; i++) { 
     for (int j = i; j < size; j++) { 
      if (s[j].getScore() > s[(j + 1)].getScore()) { 
       int tmp = s[(j + 1)].getScore(); 
       s[(j + 1)].setScore(s[j].getScore()); 
       s[j].setScore(tmp); 
       string tmp1 = s[(j + 1)].getName(); 
       s[(j + 1)].setName(s[j].getName()); 
       s[j].setName(tmp1); 
      } 
     } 
    } 
} 
+2

Ihre 'Studenten' sind ein Zeiger auf' Student'. Machen Sie es zu einem Array, wenn Sie das 'count' mit' students = new Student [count]; 'kennen. –

+5

Es gibt keine Notwendigkeit zu tun, "count = new int;" Erklären Sie es einfach als "int count"; – Sean

+2

'count = new int;' - Sie oder Ihr Lehrer sind mit den Zeigeranforderungen über Bord gegangen, wenn Sie Code wie diesen schreiben. Außerdem haben sie nicht "löschen" gelehrt? – PaulMcKenzie

Antwort

1

First off, Ihre Student Klasse kann dies vereinfacht werden. Ich habe auch das std:: Präfix hinzugefügt, weil using namespace std is considered a bad practice.

Statt nun den Zeiger mit den Studenten zu speichern, umfassen vector und verwenden, die:

std::cout << "How many students? "; 
int count; 
std::cin >> count; 

std::vector<Student> students(count); 

Die Laderoutine kann auch das Fehlen von accesors gegeben vereinfacht werden:

for (auto& student : students) { 
    std::cout << "Please enter the students name: "; 
    std::cin >> student.name; 
    std::cout << "Please enter " << student.name << "'s score: "; 
    std::cin >> student.score; 
    while (score < 0) { 
     std::cout << "ERROR: Score must be a positive number.\n"; 
     std::cin >> student.score; 
    } 
} 

Und Wenn du das einmal hast, kannst du es einfach in istream& operator>>(istream&, Student&) setzen und auf

std::copy_n(std::istream_iterator<Student>(std::cin), students.size(), students.begin()); 
reduzieren

Keine Notwendigkeit für temporäre Variablen mehr (und auch wenn Sie sie verwenden möchten, sollten sie kurz vor der Verwendung, also innerhalb der Schleife definiert werden).

Die letzte Sache ist Ihre Sortierroutine. Zunächst einmal gibt es std::sort, die Sie stattdessen verwenden können, wenn Sie einfach einen Komparator bieten:

std::sort(
    begin(students), 
    end(students), 
    [](Student const& a, Student const& b) { return b.score < a.score; } 
); 

Wenn Sie darauf bestehen, auf die Sortierroutine selbst schreiben, zumindest std::swap verwenden.