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

proto相关函数用法

如果有一个proto_name结构的 proto消息:

proto_name.set_xx(value) 该函数给对应的变量赋值

proto_name.add_xx() 该函数给对应的repeated变量增加一个xx类型的元素,返回值为指针类型。一般用法为:在for循环中调用一次,proto消息就添加一个该类型数据。

proto_name.mutable_xxx() 该函数返回指向该字段的一个指针,同时将该字段置为被设置状态。若该对象存在,则直接返回该对象,若不存在则新new 一个。
 

本文中用到的消息结构:

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_):

使用set_allocated_xxx()来设置变量的时候,变量不能是普通栈内存数据,
必须是手动new出来的指针,至于何时delete,就不需要调用者关心了,
protobuf内部会自动delete掉通过set_allocated_设置的内存;

release_xxx()是用来取消之前由set_allocated_xxx设置的数据,
调用release_xxx以后,protobuf内部就不会自动去delete这个数据;

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_):

mutable_xxx()返回分配内存后的对象,如果已经分配过则直接返回,如果没有分配则在内部分配,建议使用mutable_xxx

1

2

3

4

PointNameInfo point;

point.set_longitude(110.20);

point.set_latitude(39.55);

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

赋值方式3(使用mutable_):

1

2

3

PointNameInfo* point = pointInfo.mutable_point();

point->set_longitude(110.20);

point->set_latitude(39.55);

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值