如何访问数组中对象的数据成员?C++代码报错问题咨询
解决你的C++代码编译错误&成员访问问题
我来帮你一步步拆解代码里的问题,搞定这些编译错误:
错误原因分析
你的代码里有三个核心问题导致编译失败:
构造函数的访问权限被设为私有
C++类中默认的成员(包括构造函数)都是private权限,这意味着外部函数(比如main)根本没法调用它来创建对象,这就是前两个编译错误的根源。成员变量的访问权限问题
同样,Train_Number、Train_Name这些成员变量默认也是private的,main函数里直接赋值和访问会被编译器拒绝。指针访问成员的语法错误
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
相关产品推荐
相关产品推荐

