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

如何访问数组中对象的数据成员?C++代码报错问题咨询

解决你的C++代码编译错误&成员访问问题

我来帮你一步步拆解代码里的问题,搞定这些编译错误:

错误原因分析

你的代码里有三个核心问题导致编译失败:

  1. 构造函数的访问权限被设为私有
    C++类中默认的成员(包括构造函数)都是private权限,这意味着外部函数(比如main)根本没法调用它来创建对象,这就是前两个编译错误的根源。

  2. 成员变量的访问权限问题
    同样,Train_Number、Train_Name这些成员变量默认也是private的,main函数里直接赋值和访问会被编译器拒绝。

  3. 指针访问成员的语法错误
    ptr是一个存储TRAIN*指针的数组,每个元素都是指向TRAIN对象的指针。访问指针指向的对象成员时,必须用->运算符,而不是.(.是给直接的对象实例用的),这就是后面四个错误提示“maybe you meant to use ‘->’ ?”的原因。

修正后的代码(基础版本)

先给你一个能正常编译运行的基础版本,解决所有编译错误:

#include <iostream>
#include <string>  // 必须显式包含string头文件,否则string类型可能无法正常使用
using namespace std;

class TRAIN{
public:  // 把需要外部访问的成员放到public区域
    int Train_Number;
    string Train_Name;
    int Arrival_Hr;
    int Arrival_Min;

    // 将构造函数改为public权限,让main可以调用
    TRAIN(int Hr1,int Mn1, int Hr2, int Mn2) {
        // 顺便修正时间差计算的逻辑漏洞:如果分钟相减为负数,需要向小时借位
        Arrival_Hr = Hr2 - Hr1;
        Arrival_Min = Mn2 - Mn1;
        if (Arrival_Min < 0) {
            Arrival_Hr -= 1;
            Arrival_Min += 60;
        }
        cout << Arrival_Hr << "Hr" << Arrival_Min << "min is the difference" << endl;
    }
};

int main(){
    TRAIN *ptr[10];
    ptr[0] = new TRAIN(2,30,4,40);
    ptr[1] = new TRAIN(1,20,5,30);
    
    // 用->访问指针指向的对象成员
    ptr[0]->Train_Number = 100;
    ptr[0]->Train_Name = "Jansadabti";
    
    cout << ptr[0]->Train_Number << endl;
    cout << ptr[0]->Train_Name << endl;
    
    // 别忘了释放动态分配的内存,避免内存泄漏
    delete ptr[0];
    delete ptr[1];
    
    return 0;
}

进阶优化:符合封装原则的写法

直接把成员变量设为public虽然简单,但不符合面向对象的封装思想。更好的做法是把成员变量设为private,通过getter/setter方法来访问和修改它们,这样可以控制变量的读写权限,还能在赋值时做合法性检查:

#include <iostream>
#include <string>
using namespace std;

class TRAIN{
private:  // 成员变量设为私有,隐藏内部实现
    int Train_Number;
    string Train_Name;
    int Arrival_Hr;
    int Arrival_Min;

public:
    TRAIN(int Hr1,int Mn1, int Hr2, int Mn2) {
        Arrival_Hr = Hr2 - Hr1;
        Arrival_Min = Mn2 - Mn1;
        if (Arrival_Min < 0) {
            Arrival_Hr -= 1;
            Arrival_Min += 60;
        }
        cout << Arrival_Hr << "Hr" << Arrival_Min << "min is the difference" << endl;
    }

    // Setter方法:设置成员变量,可添加合法性检查
    void setTrainNumber(int num) {
        if (num > 0) {  // 比如限制列车编号必须为正数
            Train_Number = num;
        } else {
            cout << "Invalid train number!" << endl;
        }
    }

    void setTrainName(string name) {
        Train_Name = name;
    }

    // Getter方法:获取成员变量的值
    int getTrainNumber() const {  // const表示这个方法不会修改对象状态
        return Train_Number;
    }

    string getTrainName() const {
        return Train_Name;
    }
};

int main(){
    TRAIN *ptr[10];
    ptr[0] = new TRAIN(2,30,4,40);
    ptr[1] = new TRAIN(1,20,5,30);
    
    // 通过setter方法设置成员变量
    ptr[0]->setTrainNumber(100);
    ptr[0]->setTrainName("Jansadabti");
    
    // 通过getter方法获取成员变量的值
    cout << ptr[0]->getTrainNumber() << endl;
    cout << ptr[0]->getTrainName() << endl;
    
    delete ptr[0];
    delete ptr[1];
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Cosmos396

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:32:38