You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:17:55