协议缓冲cpp嵌入消息

时间:2013-12-05 08:36:57

标签: 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;
}

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

我不想在CmdCmdOne消息中定义消息CmdTwo。我希望重复使用Cmd消息,因为我有10条消息CmdOneCmdTen

3 个答案:

答案 0 :(得分: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);

另类,如果你想将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'

来自the docs部分:

  

给出消息类型:

message Bar {}
     

对于以下任何一个字段定义:

optional Bar foo = 1;
required Bar foo = 1;
     

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

     

...

Bar* mutable_foo()
     

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

     

...

void set_allocated_foo(Bar* bar)
     

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

答案 1 :(得分:0)

我认为最简单的方法是这样的:

 if (isPlatformBrowser(this.platformId)) {
      //your setTimeout here
  }

答案 2 :(得分:-1)

Cmd my_command;

theCommand.set_code(5);

CmdOne cmd_one;

cmd_one.mutable_cmd().copyFrom(my_command);