协议缓冲cpp嵌入消息

Nan*_*ani 11 c++ protocol-buffers

我的.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;
}
Run Code Online (Sandbox Code Playgroud)

在我的cpp文件中,我想声明CmdOne和的对象,CmdTwo并设置它们cmddata成员.但生成的pb.h文件没有cmd成员CmdOneCmdTwo对象的set方法,但有成员的set方法data.如何设置cmd每个对象的值?

我不想在Cmd里面定义消息CmdOneCmdTwo消息.我想重用Cmd,因为我有10条消息消息CmdOneCmdTen.

Fra*_*ser 19

你有几个不同的选择.您可以获得指向该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);
Run Code Online (Sandbox Code Playgroud)

Alternativey,如果你想传递的构建的实例CmdCmdOne,你可以这样做:

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'
Run Code Online (Sandbox Code Playgroud)

文档的"Singular Embedded Message Fields"部分:

给定消息类型:

message Bar {}
Run Code Online (Sandbox Code Playgroud)

对于以下任一字段定义:

optional Bar foo = 1;
required Bar foo = 1;
Run Code Online (Sandbox Code Playgroud)

编译器将生成以下访问器方法:

...

Bar* mutable_foo()
Run Code Online (Sandbox Code Playgroud)

返回指向Bar存储字段值的对象的可变指针.如果在调用之前未设置字段,则返回Bar的字段将不设置其字段(即,它将与新分配的字段相同Bar).调用此之后,has_foo()将返回truefoo()会返回一个参考的同一个实例Bar.通过调用Clear()或使指针无效clear_foo().

...

void set_allocated_foo(Bar* bar)
Run Code Online (Sandbox Code Playgroud)

Bar对象设置为字段并释放先前的字段值(如果存在).如果Bar指针不是NULL,则消息将获得已分配Bar对象的所有权has_foo()并将返回true.否则,如果BarNULL,则行为与调用相同clear_foo().