协议缓冲cpp嵌入消息

 喝西北风的东北风_711 发布于 2023-02-12 18:06

我的.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并设置它们cmddata成员.但生成的pb.h文件没有cmd成员CmdOneCmdTwo对象的set方法,但有成员的set方法data.如何设置cmd每个对象的值?

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

1 个回答
  • 你有几个不同的选择.您可以获得指向该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,如果你想传递的构建的实例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'
    

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

    给定消息类型:

    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().

    2023-02-12 18:09 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有