C++结构体程序报错求助:非静态成员函数使用无效
解决Student结构体的成员函数使用错误问题
看起来你这里犯了两个关键错误:一是把成员函数当成成员变量来直接读写,二是误用了static成员导致所有学生对象共享同一组属性。咱们一步步来修复:
错误原因分析
报错invalid use of non-static member function ‘void Student::age(int)’的核心是:你写的st.age是一个用来设置年龄的成员函数,不是存储年龄的变量,所以不能直接用cin >> st.age或者cout << st.age来读写——这就像你试图把数据直接输入到一个函数里,而不是变量里,C++肯定不允许这种操作。
另外,你把所有成员都声明为static,这意味着所有Student对象都会共享同一个姓名、年龄和年级,这显然不符合“每个学生有自己独立信息”的需求。
最简修正版代码
如果只是实现基础的输入输出功能,直接使用公共成员变量是最简洁的方式:
#include <iostream> #include <string> using namespace std; struct Student { // 改成普通成员变量,每个Student对象独立拥有这些属性 int age; string firstName; string lastName; int standard; }; int main() { Student st; // 直接读写对象的成员变量,这才是正确的操作方式 cin >> st.age >> st.firstName >> st.lastName >> st.standard; cout << st.age << " " << st.firstName << " " << st.lastName << " " << st.standard; return 0; }
封装版(保留成员函数写法)
如果你希望遵循面向对象的封装思想,用成员函数来控制属性的读写,可以这样写:
#include <iostream> #include <string> using namespace std; struct Student { private: // 把属性设为私有,外部不能直接访问 int age; string firstName; string lastName; int standard; public: // 设置属性的setter函数 void setAge(int ag) { age = ag; } void setFirstName(string fi) { firstName = fi; } void setLastName(string la) { lastName = la; } void setStandard(int st) { standard = st; } // 获取属性的getter函数(供外部读取值) int getAge() { return age; } string getFirstName() { return firstName; } string getLastName() { return lastName; } int getStandard() { return standard; } }; int main() { Student st; int age, standard; string fn, ln; // 先读取到临时变量,再调用setter函数设置属性 cin >> age >> fn >> ln >> standard; st.setAge(age); st.setFirstName(fn); st.setLastName(ln); st.setStandard(standard); // 调用getter函数获取值并输出 cout << st.getAge() << " " << st.getFirstName() << " " << st.getLastName() << " " << st.getStandard(); return 0; }
关键修改点总结
- 移除
static关键字:让每个Student对象拥有独立的属性,避免所有对象共享同一组值。 - 区分成员函数和成员变量:不能直接把成员函数当成变量来读写,要么直接操作公共成员变量,要么通过
setter(设置值)和getter(获取值)函数来正确调用。
内容的提问来源于stack exchange,提问作者batman_x
相关产品推荐
相关产品推荐

