本文中用到的消息结构:

message PointLLHA {// 通用的坐标点(经度纬度朝向高度),所有跟坐标相关的能够用就统一用这个optional double longitude = 1;// 经度坐标optional double latitude = 2;// 纬度坐标optional double heading = 3;// 朝向optional double altitude = 4;// 高度optional double timestamp_sec = 5;// 时间戳
}message VehicleHeartbeat {// 无人车的心跳optional bool is_normal = 1;optional PointLLHA vehicle_pose = 2;optional double vehicle_speed = 3;
}message VehicleRoutingInfo {  // 无人车全局路径规划的结果repeated PointLLHA way_points = 1;
}

1.简单(非嵌套)消息内容的赋值

简单的消息内容直接用set_来赋值就行。

赋值方式:

vehicle_heartbeat.set_vehicle_speed(1.2);

2.嵌套消息内容的赋值

自己定义的复杂嵌套消息不能够通过简单的set_来赋值,可采取set_allocated和mutable_两种方式,但是二者的赋值方式是不同的。

使用set_allocated_,赋值的对象需要new出来,不能用局部的,因为这里用的的是对象的指针。当局部的对象被销毁后,就会报错。

错误的赋值方式:

PointLLHA point;
point.set_longitude(116.20);
point.set_latitude(39.56);
vehicle_heartbeat.set_allocated_vehicle_pose(&point);// 这里传入的是一个马上会被销毁的指针

使用mutable_,赋值时候,可以使用局部变量,因为在调用的时,内部做了new操作。

赋值方式1(使用set_allocated_):

PointLLHA *point = new PointLLHA;
point->set_longitude(116.20);
point->set_latitude(39.56);
vehicle_heartbeat.set_allocated_vehicle_pose(point);// 这里传入的是一个指针

赋值方式2(使用mutable_):

PointLLHA point;
point.set_longitude(116.20);
point.set_latitude(39.56);
vehicle_heartbeat.mutable_vehicle_pose()->CopyFrom(point);// 这里传入的是一个变量,mutable内部有一个new函数

3.重复消息内容的赋值

带有repeated字段的消息,通过add_依次赋值。

赋值方式:

// 第一个点
PointLLHA *way_point = vehicle_routing_info.add_way_points();
way_point->set_longitude(116.20);
way_point->set_latitude(39.56);// 第二个点
PointLLHA *way_point = vehicle_routing_info.add_way_points();
way_point->set_longitude(116.21);
way_point->set_latitude(39.57);

C++ protobuf中对不同消息内容进行赋值的方式(set_、set_allocated_、mutable_、add_的使用)相关推荐

  1. protobuf 中的嵌套消息的使用 主要对set_allocated_和mutable_的使用

    protobuf的简单的使用,不过还留下了一个问题,那就是之前主要介绍的都是对简单数据的赋值,简单数据直接采用set_xx()即可,但是如果不是简单变量而是自定义的复合类型变量,就没有简单的set函数 ...

  2. 存储过程中SELECT与SET对变量赋值

    Create proc insert_book @param1char(10),@param2varchar(20),@param3money,@param4moneyoutput with encr ...

  3. sql server存储过程中SELECT 与 SET 对变量赋值的区别

    SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT. 对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们 并没有注意,其实这 ...

  4. RabbitMQ 中 7 种消息队列

    点击关注公众号,Java干货及时送达 七种模式介绍与应用场景 简单模式(Hello World) 做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B ...

  5. C#中的MessageBox消息对话框

    关键字:C# MessageBox 消息对话框 在程序中,我们经常使用消息对话框给用户一定的信息提示,如在操作过程中遇到错误或程序异常,经常会使用这种方式给用于以提示.在C#中,MessageBox消 ...

  6. 如何禁用请求库中的日志消息?

    本文翻译自:How do I disable log messages from the Requests library? By default, the Requests python libra ...

  7. Spring Cloud Stream同一通道根据消息内容分发不同的消费逻辑

    应用场景 有的时候,我们对于同一通道中的消息处理,会通过判断头信息或者消息内容来做一些差异化处理,比如:可能在消息头信息中带入消息版本号,然后通过if判断来执行不同的处理逻辑,其代码结构可能是这样的: ...

  8. 详解如何实现在线聊天系统中的实时消息获取

    序言 传统web浏览器应用采用客户端主动请求方式,只有在收到浏览器请求时服务端才返回消息,这种模式已经不能满足日益多样化的web应用需求,例如: 在线聊天系统:需要实时获取聊天消息. 实时监控系统:需 ...

  9. VB.net实现从ListView控件中异地获取文本内容源代码

    对于一些VB6工程代码来说,需要完成从VB到VB.net的转换,在转换过程中需要注意很多内容,利用VB.net的直接转换功能很少能完全成功,需要我们付出很大的努力. 下面的VB.net代码实现从其他应 ...

最新文章

  1. GAN人脸修复--Generative Face Completion
  2. abaqus单位怎么设置_ABAQUS-怎样模拟塑料瓶的抗挤压能力?
  3. 如何获取Oracle数据库中某表及索引、约束、触发器、对象权限的创
  4. The requested URL /**** was not found on this server
  5. 比IETEST更好用的浏览器兼容性测试软件[绿色]
  6. jsp网站使用ffmpeg实现为.flv格式视频截图
  7. 在docker中配置apt工具与python的源均为国内源
  8. 全球第一开源ERP Odoo操作手册 数据库简介
  9. dev-cpp的安装教程
  10. 任玉刚——百度资深工程师学习之路
  11. 【Qt炫酷动画】demo04-仿Android旋转图标的等待对话框动画
  12. PDF怎么转换成图片?来看这两种好用的方法
  13. 基于非结构网格的仿真——太湖之光上的巨大挑战
  14. Android 系统自带图片裁剪功能(适配7.0、8.0、对了还有小米手机)
  15. CorelDRAW2023最新版本图像设计软件
  16. 基于Python的阴阳师后台全平台辅助
  17. Mysql中的常用类型 说明
  18. python break函数用法_Python break用法详解
  19. Springboot @EnableAutoConfiguration 详解
  20. 拼多多的搜索的参数anti_content怎么破

热门文章

  1. XShell的会话文件存放目录
  2. svn 创建 分支 branches
  3. Windows下的subversion(SVN)下载安装及配置 -详细步骤
  4. JZOJ2020年8月10日提高组T3 玩诈欺的小杉
  5. 五项按键控制LED灯亮灭
  6. 华为机试题61-放苹果
  7. 现代信息检索(原书第2版)
  8. 数据异常检测PHM设备健康管理
  9. [杂谈]程序员的小乐趣
  10. HTML实现页面内部跳转