对数据成员的修改在函数结束后不会持续存在

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;
}