所以我现在正在尝试制作电话簿,而我的任务之一是在文本文件中读取人们的信息。 当我在main.cpp中调用该函数时,对象数组未从文本文件中获取数据。我做了一个scratch.cpp测试我要使用的方法,它可以工作,但是一旦我尝试在程序中使用它,它就无法正常工作。
我创建了一个scratch.cpp来测试我要使用的方法,它可以工作,但是一旦我尝试在程序中使用它,它就无法正常工作。
这应该更改数组的值
void TxtReader::read(Contacts* &contacts){
Contacts *contacts2 = new Contacts[0];
int contactSize = 0;
std::string firstName;
std::string lastName;
std::string phoneNumber;
std::string birthPlace;
std::string birthDate;
std::string Profession;
std::ifstream savedContacts("ContactList.txt");
Contacts newContact = Contacts();
do {
std::getline(savedContacts, firstName, ';');
std::getline(savedContacts, lastName, ';');
std::getline(savedContacts, phoneNumber, ';');
std::getline(savedContacts, birthPlace, ';');
std::getline(savedContacts, birthDate, ';');
std::getline(savedContacts, Profession, ';');
newContact.setFirstname(firstName);
newContact.setLastname(lastName);
newContact.setPhonenumber(phoneNumber);
newContact.setBirthplace(birthPlace);
newContact.setBirthdate(birthDate);
newContact.setProfession(Profession);
pushContact(contacts2, newContact, contactSize);
} while (std::getline(savedContacts, firstName));
delete[] contacts;
contacts = contacts2;
delete[] contacts2;
}
这是我在另一堂课中的称呼方式
void ContactDir::getList() {
textReader.read(contacts);
}
然后我在main.cpp中使用了这个
对我来说,一切似乎都不错,该程序可以编译,但是在到达getList函数时会崩溃。
调试器显示多个错误,例如: 主要是“ this = -var-create:无法创建变量对象”, 以及TxtReader :: read函数和Contacts类中的“ Signal = SIGSEGV(分段错误)”。而且我也有类似的错误 联系人,contacts2和newContact对象中的“ firstName =(std :: _ cxx11 :: string)”“”
Contacts类具有如下的setter和getter:
Contacts::Contacts() {}
void Contacts::setFirstname(std::string firstName) {
this->firstName = firstName;
}
std::string Contacts::getFirstname() {
return firstName;
}
答案 0 :(得分:1)
您的问题有两个方面。首先这样:
Contacts *contacts2 = new Contacts[0];
这是零大小的分配。您无法将任何内容存储到contacts2
中,因为它的大小为零。
但是,即使它的大小不为零,您也可以这样做:
contacts = contacts2;
delete[] contacts2;
contacts
指向您删除的contacts2
,因此contacts
指向已删除的内存。因此,要么不要删除contacts2
,要么(更好的是)不要使用new
并且不要使用delete
。而是使用std::vector
存储对象。例如,您的read()
函数可以引用Contacts
的向量:
void TxtReader::read(std::vector<Contacts>& contacts);
您的临时对象也将是矢量:
std::vector<Contacts> contacts2;
作业:
contacts = contacts2;
然后将按预期工作,因为它将复制对象。