这是我的两个保存数据的类: 基类持有基本人物数据:
#ifndef H_personType
#define H_personType
#include <string>
using namespace std;
class person
{
public:
//get functions
string getName() const;
string getId() const;
string getAge() const;
string getGender() const;
string getPhone() const;
string getEmPhone() const;
string getAddress() const;
string getEmail() const;
string getEmContact() const;
//set functions
void setName(string, string, string);
void setId(string);
void setAge(string);
void setGender(string);
void setPhone(string);
void setEmPhone(string);
void setAddress(string, string);
void setEmail(string);
void setEmContact(string, string);
//constructors
person();
person(string, string, string,
string, string, string, string,
string, string, string,
string, string, string,
string, string);
private:
string firstName;
string lastName;
string middleName;
string id;
string age;
string phone;
string address;
string streetNumber;
string streetName;
string gender;
string email;
string emergency_phone;
string emergencyFirstName;
string emergencyLastName;
string emergency_contact;
};
派生班级学生,持有会员职能,以修改学生特有的数据和私人会员。
#ifndef H_studentType
#define H_studentType
#include "personType.h"
#include <vector>
using namespace std;
class student: public person
{
public:
//void sortRecords();
friend int checkSize();
void addRecords();
void input(istream&, int);
void print(ostream&) const;
void printRecords(ostream&);
void loadData();
void displayOnScreen();
void searchID(string, int);
student();
student(string, string, string,
string, string, string, string, string, string,
string, string, string, string, string, string,
string, string, string, string);
protected:
vector<string> tempVec[11];
private:
string gpa;
string hobbies;
string major;
string honors;
vector<student> students;
};
#endif
这两个类是我的数据。我使用输入函数来读取一个简单的文本输入文件,该文件为学生保存数据行,想想姓名,年龄等。输入函数填充学生类型的向量。
输入功能:
void student::input(istream& inF, int size)
{
//local variables
student stud;
string first, middle, last, addressNum, addressStreet,
phone, gender, email, emContactFirst, emContactLast,
ph, emPhone,ID, age;
while (!inF.eof())
{
for (int index = 0; index < size; index++){
inF >> first >> last >> middle;
stud.setName(first, last, middle);
inF >> ID;
stud.setId(ID);
inF >> age;
stud.setAge(age);
inF >> phone;
stud.setPhone(phone);
inF >> addressNum >> addressStreet;
stud.setAddress(addressNum, addressStreet);
inF >> gender;
stud.setGender(gender);
inF >> email;
stud.setEmail(email);
inF >> emPhone;
stud.setEmPhone(emPhone);
inF >> emContactFirst >> emContactLast;
stud.setEmContact(emContactFirst, emContactLast);
inF >> stud.gpa >> stud.hobbies >> stud.major;
students.push_back(stud);
}
}
}
在此之后,我输入文件中的所有数据都存储在student类型的向量中,基本上是一个包含数据的类的向量。为了对这些数据进行操作(通过studentID搜索,按studentID删除记录,按学生ID修改记录),我想将它从类向量加载到字符串向量数组中。这是我的思绪融化的地方,我已经被困了很长时间。这是我的加载数据功能和displayOnScreen,它们根本没有合作。屏幕上的显示功能仅用于调试目的,因此我可以看到打印出的填充数组。
void student::loadData()
{
int i = 0;
for (vector<student>::iterator it = students.begin(); it != students.end(); it++)
{
for (i = 0; i < 11; i++)
{
cout << "ID = " << it->getId();
tempVec[i].push_back(it->getName());
tempVec[i].push_back(it->getId());
tempVec[i].push_back(it->getAge());
tempVec[i].push_back(it->getPhone());
tempVec[i].push_back(it->getAddress());
tempVec[i].push_back(it->getEmail());
tempVec[i].push_back(it->getEmPhone());
tempVec[i].push_back(it->getEmContact());
tempVec[i].push_back(it->gpa);
tempVec[i].push_back(it->honors);
tempVec[i].push_back(it->major);
}
if (i = 10)
break;
}
}
void student::displayOnScreen()
{
for (vector<string>::iterator it = tempVec[1].begin(); it != tempVec[1].end(); it++){
for (int u = 0; u < 11; u++)
{
cout << tempVec[1].at(u) << " ";
}
cout << endl;
}
}
拜托,我知道这是一个很大的问题,非常感谢任何帮助。
答案 0 :(得分:1)
这是一种反模式
while (!inF.eof())
{
}
请参阅:Why is iostream::eof inside a loop condition considered wrong?
这是一个错误:
if (i = 10) // Notice this sets i to 10 which is true
break; // So this breaks the first time.
// Use == for testing (notice two of them)
您可以通过确保修复所有警告来阻止此错误。 在启用所有警告的情况下编译代码,并要求编译器将警告视为错误(因为它们是代码中的逻辑错误)。
如果你想显示学生的矢量,那么这样做更容易:
for(auto const& s: students)
{
std::cout << s << std::endl;
}
然后为学生定义输出操作符
std::ostream& operator<<(std::ostream& str, student const& s)
{
str << s. getName() << ... etc ...;
return str;
}
您可能还应该为student
定义输入操作符,这样您就可以将学生的阅读本地化为operator>>
PS:我想要一个code review,但只有一次工作。