对数据成员的修改在函数结束后不会持续存在
Modifications to data members do not persist after function ends
我有一个简单的层次结构,它由一个具有 ConversationManager con_manager*
数据成员的代理组成,该数据成员处理 std::vector<Conversation> conversations
中的任意数量的对话,这些对话本身包含 1-5 条消息std::Vector<Message> messages
。
如果我通过
开始对话
ConversationManager::startConversation(Message &message) {
Conversation conversation = Conversation(message);
conversations.push_back(conversation)
}
消息已正确保存。
但是通过
添加消息后
int ConversationManager::addMessage(Message &message){
if(conversations.size() > 0){
Conversation conversation = conversations.back();
conversation.addMessage(message);
return 0;
}
return -1;
}
和
int Conversation::addMessage(Message &message){
…
messages.push_back(message);
…
}
除了第一个消息之外的后续消息不会被保存。在 Conversation::addMessage(Message &message)
中打印 messages
的大小和内容表明我的消息保存在该函数中,但似乎在函数范围结束时丢失了。据我了解,一种解释是 ConversationManager::addMessage(Message &message)
中使用的 conversation
对象只是一个副本,因此不会保存修改。但是std::Vector::back()
returns一个参考,所以这应该是不可能的。
我尝试只使用一个没有 ConversationManager 的 Conversation 对象,然后消息被永久保存。我觉得问题在于我对参考用法的误解。我不认为需要更多代码来理解,但如果有人认为需要,我可以提供它。任何关于为什么会发生这种情况的帮助将不胜感激,我认为我在这里犯了一个根本错误但无法摆脱 "This shouldn't be happening"-心态。
这个
Conversation conversation = conversations.back();
创建一个副本。
使用
Conversation& conversation = conversations.back();
使用参考。
这是问题所在:
if(conversations.size() > 0){
Conversation conversation = conversations.back();
conversation.addMessage(message);
return 0;
}
上面代码片段的第二行制作了一个对话的副本,然后向副本添加一条消息。然后最近修改的副本在块结束时超出范围时“消失”。
您可以创建对对话的引用,然后修改现有对话,如下所示:
if(conversations.size() > 0){
Conversation& conversation = conversations.back(); // note reference
conversation.addMessage(message);
return 0;
}
我有一个简单的层次结构,它由一个具有 ConversationManager con_manager*
数据成员的代理组成,该数据成员处理 std::vector<Conversation> conversations
中的任意数量的对话,这些对话本身包含 1-5 条消息std::Vector<Message> messages
。
如果我通过
开始对话ConversationManager::startConversation(Message &message) {
Conversation conversation = Conversation(message);
conversations.push_back(conversation)
}
消息已正确保存。 但是通过
添加消息后int ConversationManager::addMessage(Message &message){
if(conversations.size() > 0){
Conversation conversation = conversations.back();
conversation.addMessage(message);
return 0;
}
return -1;
}
和
int Conversation::addMessage(Message &message){
…
messages.push_back(message);
…
}
除了第一个消息之外的后续消息不会被保存。在 Conversation::addMessage(Message &message)
中打印 messages
的大小和内容表明我的消息保存在该函数中,但似乎在函数范围结束时丢失了。据我了解,一种解释是 ConversationManager::addMessage(Message &message)
中使用的 conversation
对象只是一个副本,因此不会保存修改。但是std::Vector::back()
returns一个参考,所以这应该是不可能的。
我尝试只使用一个没有 ConversationManager 的 Conversation 对象,然后消息被永久保存。我觉得问题在于我对参考用法的误解。我不认为需要更多代码来理解,但如果有人认为需要,我可以提供它。任何关于为什么会发生这种情况的帮助将不胜感激,我认为我在这里犯了一个根本错误但无法摆脱 "This shouldn't be happening"-心态。
这个
Conversation conversation = conversations.back();
创建一个副本。 使用
Conversation& conversation = conversations.back();
使用参考。
这是问题所在:
if(conversations.size() > 0){
Conversation conversation = conversations.back();
conversation.addMessage(message);
return 0;
}
上面代码片段的第二行制作了一个对话的副本,然后向副本添加一条消息。然后最近修改的副本在块结束时超出范围时“消失”。
您可以创建对对话的引用,然后修改现有对话,如下所示:
if(conversations.size() > 0){
Conversation& conversation = conversations.back(); // note reference
conversation.addMessage(message);
return 0;
}