我的.proto文件看起来像
message Cmd { int code = 1; } message CmdOne { required Cmd cmd = 1; required int data = 2; } message CmdTwo { required Cmd cmd = 1; required string data = 2; }
在我的cpp文件中,我想声明CmdOne
和的对象,CmdTwo
并设置它们cmd
和data
成员.但生成的pb.h文件没有cmd
成员CmdOne
和CmdTwo
对象的set方法,但有成员的set
方法data
.如何设置cmd
每个对象的值?
我不想在Cmd
里面定义消息CmdOne
和CmdTwo
消息.我想重用Cmd
,因为我有10条消息消息CmdOne
来CmdTen
.
你有几个不同的选择.您可以获得指向该cmd
字段的非const指针,然后适当地分配值:
CmdOne cmd_one; Cmd* cmd(cmd_one.mutable_cmd()); cmd->set_code(2); // Previous 2 lines could be simplified to: // cmd_one.mutable_cmd()->set_code(2);
Alternativey,如果你想传递的构建的实例Cmd
入CmdOne
,你可以这样做:
Cmd* cmd(new Cmd); cmd->set_code(1); CmdOne cmd_one; cmd_one.set_allocated_cmd(cmd); // Takes ownership of cmd - // you don't call 'delete cmd'
从文档的"Singular Embedded Message Fields"部分:
给定消息类型:
message Bar {}对于以下任一字段定义:
optional Bar foo = 1; required Bar foo = 1;编译器将生成以下访问器方法:
...
Bar* mutable_foo()返回指向
Bar
存储字段值的对象的可变指针.如果在调用之前未设置字段,则返回Bar
的字段将不设置其字段(即,它将与新分配的字段相同Bar
).调用此之后,has_foo()
将返回true
并foo()
会返回一个参考的同一个实例Bar
.通过调用Clear()
或使指针无效clear_foo()
....
void set_allocated_foo(Bar* bar)将
Bar
对象设置为字段并释放先前的字段值(如果存在).如果Bar
指针不是NULL
,则消息将获得已分配Bar
对象的所有权has_foo()
并将返回true
.否则,如果Bar
是NULL
,则行为与调用相同clear_foo()
.