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

我有一个简单的层次结构,其中包含一个具有Conversationmanager con_manager*数据成员的代理,该数据成员处理std::vector<Conversation> conversations中的任意数量的会话,而这些会话本身在{{ 1}}。

如果我通过进行对话

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); … } 中打印messages的大小和内容表明,我的消息已保存在该函数中,但是在函数范围结束时似乎丢失了。据我了解,一种解释是Conversation::addMessage(Message &message)中使用的conversation对象只是一个副本,因此不保存修改。但是Conversationmanager::addMessage(Message &message)返回一个引用,因此应该是不可能的。

我尝试仅使用一个Conversation对象而不使用Conversationmanager,然后将消息永久保存。我觉得问题出在我对参考用法的误解。我认为理解不需要更多的代码,但是如果有人认为需要,我可以提供它。对于出现这种情况的任何帮助,我们将不胜感激,我想我在这里犯了一个根本性的错误,但不能摆脱“这不应该发生”的思想观念。

jun8888888 回答:函数结束后,对数据成员的修改不会持续

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;
}
本文链接:https://www.f2er.com/3151116.html

大家都在问