类指针单元化局部变量

问题描述:

最近在我的C++类中,我们已经了解了指针和类。类指针单元化局部变量

我正在尝试制作一个有class Student的程序,我们将指出每个学生的姓名和考试分数。

输入姓名和考试分数后,他们被排序,然后按照从高到低的顺序排列。

我相信我所有的语法都是正确的,但是我仍然在学习。我遇到的问题是,我第一次使用我的类,我得到一个未初始化的局部变量错误,有关如何解决此问题的任何帮助?由于存取什么都不做,

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

#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

你的学生是指向学生的指针。使用'students = new Student [count];'知道'count'后,将其设为数组。 –

+5

有没有必要做'count = new int;'只需将它声明为'int count'; – Sean

+2

'count = new int;' - 如果您编写这样的代码,您或您的老师已经超出指针要求。另外,他们没有教'删除'? – PaulMcKenzie

首先,你Student类可以简化为这一点。我还添加了std::前缀,因为using namespace std is considered a bad practice

现在,而不是使用指针来保存学生,包括vector和使用:

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

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

加载程序也可以简化鉴于缺乏accesors的:

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; 
    } 
} 

而且实际上,一旦你有这个,你可以把它放在istream& operator>>(istream&, Student&),并将其减少到:

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

现在不再需要临时变量了(即使您想使用它们,也应该在使用之前定义,因此在循环内部)。

最后一件事是你的排序例程。首先,有std::sort,您可以使用如果您只是提供了一个比较:

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

如果你坚持自己写的排序例程,至少使用std::swap