当前位置: 首页 > article >正文

【C++ protobuf中对不同消息内容进行赋值的方式】

本文中用到的消息结构:

message PointNameInfo {
  optional double longitude = 1;// 经度坐标
  optional double latitude = 2;// 纬度坐标
  optional uint64 timestamp_sec = 3;// 时间戳
  optional uint32 scale = 4;
  optional string name = 5;
}
 
message PointInfo {
  optional bool hasPointName = 1;
  optional bool hasPointIcon = 2;
  optional PointNameInfo point= 3;
  optional PointCode pointCode = 4;
}
 
message SearchResultList {
  repeated Point result_points = 1; 
}

enum PointCode
{
	POINT_CODE_BMD_POINT = 0;
	CAR = 1;
	COMPASS = 2;
	ROAD_NAME = 3;
	ROAD_NUMBER = 4;
	POI = 5;
}

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

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

赋值方式:

PointNameInfo pointNameInfo;
pointNameInfo.set_name("car");

2.嵌套消息内容的赋值

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

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

错误的赋值方式:

1

2

3

4

PointNameInfo point;

point.set_longitude(110.20);

point.set_latitude(39.55);

pointInfo.set_allocated_point(&point);// 这里传入的是一个马上会被销毁的指针

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

赋值方式1(使用set_allocated_):

1

2

3

4

PointNameInfo *point = new PointNameInfo;

point->set_longitude(110.20);

point->set_latitude(39.55);

pointInfo.set_allocated_point(point);// 这里传入的是一个指针

赋值方式2(使用mutable_):

1

2

3

4

PointNameInfo point;

point.set_longitude(110.20);

point.set_latitude(39.55);

pointInfo.mutable_point()->CopyFrom(point);// 这里传入的是一个变量,mutable内部有一个new函数

3.重复消息内容的赋值

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

赋值方式:

1

2

3

4

5

6

7

8

9

// 第一个点

PointNameInfo *result_point = searchResultList.add_result_points();

result_point->set_longitude(110.20);

result_point->set_latitude(39.55);

// 第二个点

PointNameInfo *result_point = searchResultList.add_result_points();

result_point->set_longitude(110.21);

result_point->set_latitude(39.56);

 


http://www.kler.cn/a/158745.html

相关文章:

  • 设计模式-Adapter(适配器模式)GO语言版本
  • RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)
  • 能源革命持续发力,华普微隔离器助力储能行业“向绿向新”
  • 【论文阅读】主动推理:作为感知行为的理论
  • 机器学习(1)
  • vue使用List.reduce实现统计
  • Appium:iOS测试比Android测试更难?
  • Linux-hid
  • Shell数组函数:数组(二)
  • 继在统信UOS上运行.Net Core之后,保持其在后台运行,并出错自重启
  • Unity渲染Stats分析
  • 使用Docker在Debian上构建GRBL模拟器镜像:简明步骤和操作指南
  • C语言--每日选择题--Day36
  • 随机链表的复制[中等]
  • 服务器以及页面无报错,但是ajax一直回调error。怎么查找报错信息,更好地了解到底是什么问题导致了请求失败
  • Qt 大小端转换函数qFromBigEndian qFromLittleEndian
  • 【亲测有效,超详细】收到微信小程序限期完成微信认证通知怎么处理?微信小程序年审认证都需要哪些资料?
  • Flink之复杂事件处理CEP
  • Linux下安装Nginx
  • 前端开发新趋势:Web3、区块链与虚拟现实
  • 解决:ModuleNotFoundError: No module named ‘qt_material‘
  • C++进阶篇7---异常
  • Unity中动态合批
  • SpringBoot+vue显示图片
  • CPP-SCNUOJ-Problem P24. [算法课贪心] 跳跃游戏
  • 鱼香ROS一键安装命令(支持微信、docker、ros等)