Изменения в элементах данных не сохраняются после завершения функции - PullRequest
1 голос
/ 06 ноября 2019

У меня есть простая иерархия, которая состоит из Агента, который имеет элемент данных 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);
    …
}

последующие сообщения, кроме первого, не сохраняются. Печать размера и содержимого messages в Conversation::addMessage(Message &message) показывает, что мое сообщение сохраняется в этой функции, но, похоже, теряется, когда заканчивается область действия функции. Насколько я понимаю, объяснение будет состоять в том, что conversation объекты, используемые в ConversationManager::addMessage(Message &message), являются просто копией и, следовательно, модификации не сохраняются. Но std::Vector::back() возвращает ссылку, поэтому это должно быть невозможно.

Я пробовал иметь только один объект Conversation без ConversationManager, и затем сообщения сохраняются на постоянной основе. У меня есть ощущение, что проблема заключается в моем неправильном понимании использования ссылок. Я не думаю, что для понимания требуется больше кода, но я могу предоставить его, если кто-то сочтет это необходимым. Любая помощь в отношении того, почему это происходит, будет принята с благодарностью, я думаю, что я делаю здесь фундаментальную ошибку, но не могу выбраться из-под мышления "Этого не должно быть".

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Это проблема:

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;
}
1 голос
/ 06 ноября 2019

Это

Conversation conversation = conversations.back();

создает копию. Используйте

Conversation& conversation = conversations.back();

, чтобы использовать ссылку.

...