我是google protobuf的新手,知道以下方法有什么不同之处:
1)
foo.mutable_bar()->set_somefield(...)
和
2)
nestedmsg = foo.bar();
nestedmsg.set_somefield() (where bar is message)
我发现foo.bar()对我不起作用。文档中的不同之处在于可变调用返回指针而不是default_instance。但为什么第二种方式不起作用?
答案 0 :(得分:1)
你的第二个版本甚至不应该编译:{{1}}返回一个const引用,但bar()
不是const方法。不要使用set_somefield()
来解决这个问题!
方法之间的区别在于,const_cast
实际上使用新的子消息初始化mutable_bar()
字段(如果它尚不存在)。也就是说,如果bar
在has_bar()
之后总是返回true
,即使它是mutable_bar()
之前也是如此。另一方面,false
永远不会修改消息,因此不会影响bar()
。如果未设置has_bar()
字段,则bar
将返回对该类型的默认实例的引用,您应该从不修改 - 这就是为什么它是const。
如果您需要修改子消息,则必须始终使用bar()
变体。别担心,它永远不会返回空指针。