类指针单元化局部变量
问题描述:
最近在我的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);
}
}
}
}
答
首先,你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
。
你的学生是指向学生的指针。使用'students = new Student [count];'知道'count'后,将其设为数组。 –
有没有必要做'count = new int;'只需将它声明为'int count'; – Sean
'count = new int;' - 如果您编写这样的代码,您或您的老师已经超出指针要求。另外,他们没有教'删除'? – PaulMcKenzie