gpt4 book ai didi

c++ - 访问对象 vector 内的对象时出现段错误

转载 作者:行者123 更新时间:2023-11-30 02:04:34 24 4
gpt4 key购买 nike

我在尝试访问存储在 vector 中的对象时遇到段错误。我有一个由流程组成的调查。每个过程都包含问题。因此,调查对象包含一个 vector 或过程,每个过程对象包含一个问题 vector 。类定义如下:

class Survey {
private:
...
vector <Process> survey_processes;
....
public:
......
vector<Process> getSurveyProcesses()
{ return survey_processes; }
void addProcessObj(Process obj)
{ survey_processes.push_back(obj);}
.....
};

class Process
{
private:
....
vector<Question> proc_questions;
....
public:
...
vector<Question> getProcessQuestions()
{ return proc_questions;}
void addQuestionObj(Question obj)
{ proc_questions.push_back(obj); }
.....
};
class Question {
private:

int quesnum;
int answer;
...
public:
Question (int c_ques, int c_ans)
{
quesnum = c_ques;
answer = c_ans;
}
int getQuestionID()
{
return quesnum;
}
int getAnswer()
{
return answer;
}
...
};

随着新流程对象的创建,我将其存储在流程 vector 中,对于每个流程对象,我将问题对象推送到问题 vector 中。对于调查对象,我想从流程 vector 中获取每个流程,对于每个流程对象,获取每个问题对象并打印出来。

我可以使用以下代码访问流程对象并成功打印它们。

cout << ((survey_obj.getSurveyProcesses()).back()).getProcessID() << endl;

当我尝试从 Process vector 中提取问题对象时,它给我一个段错误。我相信我在尝试访问该对象时犯了一些语法错误。如何访问嵌入在给定过程对象的问题 vector 中的问题对象,该过程对象位于给定调查对象的过程对象 vector 中?

这是发生段错误的代码的相关部分。

int procnum = 0;
for (unsigned i = 11; i < all_words.size()-1; ++i)

{

vector<string> v;
string s = all_words.at(i);
stringstream ques_stream(s);

int ques_num;
ques_stream >> ques_num;
ques_stream.ignore();

// if process object already exists, do nothing. Otherwise create a new process object and add it to the survey object
if (procnum == ques_num)
;
else
{
Process proc_obj(ques_num);
survey_obj.addProcessObj(proc_obj);
procnum = ques_num;

}

string ques_strng;
ques_stream >> ques_strng;
ques_stream.ignore();
Question ques_obj(ques_strng);

// objective: put the new question object in the question vector of the last process object from the process vector of the survey object
cout << ((survey_obj.getSurveyProcesses()).back()).getProcessID() << endl;
Process current_proc_obj = (survey_obj.getSurveyProcesses()).back();
cout << " Current Process : " << current_proc_obj.getProcessID() << endl;
Question current_question_obj = (current_proc_obj.getProcessQuestions()).back();


((survey_obj.getSurveyProcesses()).back()).addQuestionObj(ques_obj);

**// this is where the segmentation fault occurs when i try to get the last object from process vector of the survey and for that object get the last element of the question vector. print the question id of this question object
cout << " Current Question : " << ((((survey_obj.getSurveyProcesses()).back()).getProcessQuestions()).back()).getQuestionID() << endl;**

cout << " Current Process Question : " << ((current_proc_obj.getProcessQuestions()).back()).getQuestionID() << endl;

}

我尝试运行 gdb 调试器,但它只告诉我在尝试访问问题 ID 时发生错误。我仍然不知道我做错了什么,任何帮助将不胜感激。

最佳答案

((survey_obj.getSurveyProcesses()).back()).addQuestionObj(ques_obj);
_______________copy^, _copy^ - ^_______added to copy

由于您按值而不是引用返回 vector ,因此您将 ques_obj 添加到临时本地 vector,而不是 survey_obj.

发生崩溃是因为您正在访问(空) vector 的末尾,因为没有向其中添加任何内容。

解决此问题的一种方法是通过引用 而非 返回类成员vector。 (因为按值可以被认为是变量的拷贝。)

class Survey {
private:
vector <Process> survey_processes;
public:
vector<Process>& getSurveyProcesses()//<--ampersand indicates return by reference
{ return survey_processes; }
};

现在,当您尝试这样做时:

((survey_obj.getSurveyProcesses()).back()).addQuestionObj(ques_obj);
______^ this is the vector inside the Survey class,
not a copy

幸运的是,std::vector::back also returns by reference ,因此 ques_obj 被添加到 vector 持有的对象中,由 Survey 对象持有 - 不涉及本地临时拷贝!稍后,当您去查询该问题时,您会在预期的位置找到它。

两个最后的注意事项:1)您应该决定是否还应该通过引用返回 process_questions; 2) 如果您使用 vector 的功能来告诉您它包含多少元素,而不是仅仅假设 back() 会起作用,您就会发现这个问题更早。 :)

关于c++ - 访问对象 vector 内的对象时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10452635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com