假设我有:
我的标题文件:
class student{
public:
void setStudent(char *, char *, int, char, char *);
char getStudent();
void printStudent();
private:
char *name;
char *major;
int id;
float gpa;
char *city;
}
我的implementation.cpp:
void Student::setStudent(char *sName, char *sMajor, int sID, float sGPA , char *sCITY){
//set def student.
name = sName;
major = sMajor;
ID = sID;
gpa = sGPA;
city = sCITY;
}
char student::getStudent(){
}
void student::printStudent(){
cout << "Name: " << sName << endl;
cout << "Major: " << sMajor << endl;
cout << "ID: " << sID << endl;
cout << "GPA: " << sGPA << endl;
// city will be the "labels", no need to print.
}
我的问题是,对于getStudent()
,我应该制作五个不同的功能,例如getStudentName() { return name; } ... getStudentMajor() { return major; }
吗?或者无论如何我可以在getStudent();
中做一次,因为我认为我不能同时归还所有班级成员。
我应该使用指针功能吗?我需要使用strcpy
和strcmp
。
PS:所有数组仍必须动态声明,指针用于数据操作。
另外,在我的readFile() { ifstream fin; }
中如何使用fin
调用类函数? fin >> getStudentName;
或fin = getStudentName;
?
在阅读文本文件和ADT课程时,有什么我需要注意的吗?
答案 0 :(得分:0)
或者无论如何我可以在我的getStudent();
中做一次
不要在你的类中有多个字段,只需创建一个结构:
struct StudentInfo {
char *name;
char *major;
int id;
float gpa;
char *city;
}
你的新班级:
class student{
public:
void setStudent(char *, char *, int, char, char *);
char getStudent();
void printStudent();
private:
StudentInfo info;
}
并在getStudent中:
return self.info;
答案 1 :(得分:0)
......我应该制作五种不同的功能......
是
无论如何,我可以在
中进行一次getStudent();
你不应该这样做;它会使你的代码更难理解和阅读。
我应该使用指针功能吗?我需要使用
strcpy
和strcmp
。
否和否。如果您必须使用strcpy
和strcmp
,那么您将被一位不了解C和C ++差异的老师教授“C ++”。
如何从文件中加载学生?
您为学生类型重载>>
运算符。
使用建议更新了代码:
Student.h:
#include <string>
class student{
public:
void setStudent(const std::string& name, const std::string& major, int id, float gpa, const std::string& city);
std::string& getName();
std::string& getMajor();
float getGPA();
std::string& getCity();
void printStudent();
friend std::istream& operator>>(std::istream& in_stream, Student& student);
private:
std::string m_name;
std::string m_major;
int m_id;
float m_gpa;
std::string m_city;
}
Student.cpp:
std::string& getCity();
void printStudent();
void Student::setStudent(const std::string& name, const std::string& major, int id, float gpa, const std::string& city) {
//set def student.
m_name = name;
m_major = major;
m_ID = Id;
m_gpa = gpa;
m_city = city;
}
std::string& student::getName() {
return m_name;
}
std::string& student::getMajor() {
return m_major;
}
int student::getId() {
return m_id;
}
float student::getGPA() {
return m_gpa;
}
std::string& student::getCity() {
return m_city;
}
void student::printStudent() {
cout << "Name: " << getName() << endl;
cout << "Major: " << getMajor() << endl;
cout << "ID: " << getId() << endl;
cout << "GPA: " << getGPA() << endl;
// city will be the "labels", no need to print.
}
std::istream& operator>>(std::istream& in_stream, Student& student) {
in_stream >> student.m_name;
in_stream >> student.m_major;
in_stream >> student.m_id;
in_stream >> student.m_gpa;
in_stream >> student.m_city;
return in_stream;
}
答案 2 :(得分:-1)
首先修复你的名字和类型,使它们都匹配。
如果你想返回所有你可以通过引用或指针获取它们:
void getStudent(char *name, char *major, int& id, float& gpa, char *city) const{
id = this->id;
gpa = this->gpa;
memcpy(name,this->name,strlen(this->name) + 1);
memcpy(major,this->major,strlen(this->major) + 1);
memcpy(city,this->city,strlen(this->city) + 1);
}
这将生成数据的副本,因此您的getter为const
。使用它时,必须确保为名称,专业和城市分配足够的内存。
如果你想要一个允许根据某种原因改变数据的getter你需要
void getStudent(char **name, char **major, int* id, float* gpa, char **city) {
*id = this->id;
*gpa = this->gpa;
*name = this->name;
*major = this->major;
*city = this->city;
}