如何在C ++中将对象数组的值正确传递给另一个对象?

时间:2019-04-19 18:23:53

标签: c++ oop

所以我现在正在尝试制作电话簿,而我的任务之一是在文本文件中读取人们的信息。 当我在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;
}

1 个答案:

答案 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;

然后将按预期工作,因为它将复制对象。