Search code examples
c++protocol-buffersmutableproto

mulit netsting `mutable` in Google proto


I have proto file, saying that,

message RecommendInfo{
 repeated RecommendItem vec_item = 1;  
}

message Response{
 RecommendInfo recomInfo = 1;
}

I want to produce type Response response. So I use following code,

Response response;
*(recommendResponse.recominfo().mutable_vec_item()) = {items.begin(), items.end()};
LOG_INFO << response.DebugString();

But there gets empty vecitem. I thought there existed Response object on stack. Response object includes RecommendInfo object on the stack. Because I want to change items inside RecommendInfo object. So I use mutable_vec_item() to set items.

I try

*(recom_response.mutable_recominfo()->mutable_vecitem()) = {items.begin(), items.end()};

The code works and print complete RecommendInfo object including vec_item.

I can't explain it clearly. When I try to change recom_response.recominfo(), it seems to be wrong. However,isn't RecommendInfo an object on stack? And I just want to modify vec_item.


Solution

  • Modifying vecitem modifies the RecommendInfo it belongs to.

    So in order to modify the content of vecitem, you have to be operating on a modifiable (aka mutable) RecommendInfo. That's why you have to use mutable_recominfo() instead of recominfo().