7-3 通过指针,输出对象数组的数据
分数 100
作者 杨雪华
单位 沈阳师范大学
设计一个类,主函数中建立一个对象数组,输入5个学生数据(学号、成绩),用对象指针指向数组首元素,输出5个学生的数据。
输入格式:
输入5个学生数据(学号、成绩),学号为不超过10000的正整数,成绩为0-100的正整数。
输出格式:
按顺序输出学生的学号和成绩,每行显示一个学生的信息。
输入样例:
在这里给出一组输入。例如:
101 90
102 80
103 70
104 60
105 50
输出样例:
在这里给出相应的输出。例如:
101 90
102 80
103 70
104 60
105 50
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
第一次运行代码报错(错误的)
#include <iostream>
using namespace std;
class Student
{
public:
int id;
int score;
Student (int id,int score):id(id),score(score)
{
}
void display() const{
cout << id <<" "<<score << endl;
}
};
int main()
{
Student students[5];
for (int i = 0;i<5;i++)
{
int id,score;
cin >>id >>score;
students[i] =Student(id,score);
}
Student* ptr = students;
for(int i =0;i<5;i++)
{
ptr->display();
++ptr;
}
return 0;
}
报错
查资料后
这个错误表明编译器在尝试创建一个Student对象时,没有找到合适的默认构造函数(即不带参数的构造函数)。在你的代码中,你提供了一个带有两个参数的构造函数Student(int id, int score),但是如果你尝试创建一个Student对象数组(比如Student students[5];),并且没有显式地初始化每个对象,编译器会尝试使用默认构造函数来初始化它们。
由于你没有提供默认构造函数,编译器找不到一个合适的构造函数来调用,因此会报出这个错误。
为了解决这个问题,你可以做以下两件事中的任何一件:
提供一个默认构造函数。这可以是一个空构造函数,或者是一个带有默认参数的构造函数。例如:
class Student {
public:
int id;
int score;
// 默认构造函数
Student() : id(0), score(0) {}
// 带参数的构造函数
Student(int id, int score) : id(id), score(score) {}
// ... 其他成员函数 ...
};
在创建数组时,显式地初始化每个对象。这可以通过使用花括号初始化列表或者循环初始化来实现。例如:
// 使用花括号初始化列表
Student students[5] = {
{101, 90},
{102, 80},
{103, 70},
{104, 60},
{105, 50}
};
// 或者在循环中初始化for (int i = 0; i < 5; ++i) {
// 假设有一个函数可以生成id和score
int id = generateId();
int score = generateScore();
students[i] = Student(id, score);
}
注意,在C++11及以后的版本中,如果你不提供任何构造函数,编译器会为你自动生成一个默认构造函数。但是,一旦你提供了任何构造函数(如你提供的带参数的构造函数),编译器就不会再自动生成默认构造函数了。因此,在这种情况下,你需要显式地提供一个默认构造函数,或者在创建对象时提供初始化。
正确代码
#include <iostream>
using namespace std;
class Student
{
public:
int id;
int score;
//默认构造函数
Student ():id(0),score(0){
}
Student (int id,int score):id(id),score(score)
{
}
void display() const{
cout << id <<" "<<score << endl;
}
};
int main()
{
Student students[5];
for (int i = 0;i<5;i++)
{
int id,score;
cin >>id >>score;
students[i] =Student(id,score);
}
Student* ptr = students;
for(int i =0;i<5;i++)
{
ptr->display();
++ptr;
}
return 0;
}