C++中调用student类对象报错:no match for call to '(student) (std::string&, int&, int&)'
问题原因与解决方法
你的代码报错是因为 students[i](a, b, c) 这一行试图将已创建的 student 对象当作函数调用,但你的 student 类并没有重载接受这三个参数的函数调用运算符(operator())。实际上,数组中的每个 student 对象已经通过默认构造函数初始化了,你不能直接对已有对象调用构造函数。
以下是几种可行的修复方案:
方案1:直接赋值新的student对象
将报错的行替换为赋值语句,利用带参数的构造函数创建临时对象并赋值给数组元素:
students[i] = student(a, b, c);
修改后的完整main函数:
int main(){ cout << "Enter no. of students: "; int n; cin >> n; student students[n]; for(int i = 0; i < n; i++){ cout << "Enter student name: "; string a; cin >> a; cout << "Enter student roll_no: "; int b; cin >> b; cout << "Enter student marks: "; int c; cin >> c; students[i] = student(a, b, c); // 修改此处 } for (int i = 0; i < n; i++){ students[i].get(); } }
方案2:添加setter方法到student类
在 student 类的public区域添加一个用于设置成员变量的方法,然后调用该方法初始化对象:
class student{ private: string name; int roll_no; int marks; public: student(){ name = " "; roll_no = 0; marks = 0; } student(string a, int b, int c){ name = a; roll_no = b; marks = c; } void get(){ cout << name << "\t" << roll_no << "\t" << marks << endl; } // 新增setter方法 void set(string a, int b, int c){ name = a; roll_no = b; marks = c; } };
然后将报错行替换为:
students[i].set(a, b, c);
方案3:使用std::vector替代变长数组(更符合C++标准)
你当前使用的 student students[n] 是C风格变长数组(VLA),这并非标准C++特性(仅部分编译器支持)。推荐使用std::vector来动态管理对象:
#include <iostream> #include <string> #include <vector> // 引入vector头文件 using namespace std; class student{ private: string name; int roll_no; int marks; public: student(){ name = " "; roll_no = 0; marks = 0; } student(string a, int b, int c){ name = a; roll_no = b; marks = c; } void get(){ cout << name << "\t" << roll_no << "\t" << marks << endl; } }; int main(){ cout << "Enter no. of students: "; int n; cin >> n; vector<student> students; // 定义vector students.reserve(n); // 可选:预分配空间提升效率 for(int i = 0; i < n; i++){ cout << "Enter student name: "; string a; cin >> a; cout << "Enter student roll_no: "; int b; cin >> b; cout << "Enter student marks: "; int c; cin >> c; students.emplace_back(a, b, c); // 直接在vector中构造对象 } for (auto &s : students){ // 范围for循环遍历 s.get(); } }
这个方案不需要提前默认构造对象,而是直接在vector中构造所需的student实例,更高效且符合标准。
内容的提问来源于stack exchange,提问作者codequeen
相关产品推荐
相关产品推荐

