【Protobuf速成指南】oneof关键字的使用

news/2025/1/13 12:06:57/

文章目录

  • 2.3 oneof 字段
    • 一、基本认识
    • 二、 3.2 oneof相关函数
    • 三、Contact2.3 改写

2.3 oneof 字段

 本系列文章将通过对通讯录项目的不断完善,带大家由浅入深的学习Protobuf的使用。这是Contacts的2.3版本,在这篇文章中将带大家学习Protobuf的 oneof 语关键字,并将其用到我们的项目中

一、基本认识

​ oneof类型可以同时包含多个类型的字段,但是同时只能有一个字段被设置。在我们有多选一的需求时,oneof字段可强化这个行为,同时也能有节约内存的效果。

message PeopleInfo{string name = 1;// ……oneof other_contact{string qq = 5;string wechat = 6;}
}

oneof有如下的语法规定:

  1. oneof内的字段和上一层的字段属于同一级别,因此不能重名

  2. oneof内的字段不能用 Repeated 修饰

  3. oneof内同时只能有一个字段被设置。如果oneof字段被重复设置,则以最后设置的结果为准

二、 3.2 oneof相关函数

我们在 .proto 文件中添加“其他联系方式”字段,并使用oneof修饰

syntax = "proto3";
package contact2;message Address{string home = 1;string company = 2;
}message PeopleInfo{string name = 1;int32 age = 2;message Phone{   string number = 1;enum PhoneType{MOBILE = 0;FIXED = 1;}PhoneType type = 2;}repeated Phone phone = 3;google.protobuf.Any addr = 4;// ----------- 添加部分 ----------oneof other_contact{string qq = 5;string wechat = 6;}
// -------------------------------
}message Contact{repeated PeopleInfo contact = 1;
}

重新编译 .proto 文件后,观察学习新生成的代码

  • oneof字段被解释成枚举类型,内容如下:

    enum OtherContactCase {kQq = 5,kWechat = 6,OTHER_CONTACT_NOT_SET = 0,
    };
    
  • 对于qq,wechat字段,除了基本的设置、获取、清空等所有字段都会生成的函数外,还生成了 has_xx 函数,用来判断该字段是否被设置

    bool has_qq() const;
    bool has_wechat() const;
    
  • x_case()函数用来判断oneof字段中哪一个字段被设置

    image-20230611090859623

三、Contact2.3 改写

write.cc

cout << "请选择其他联系方式:(0.NULL   1. QQ   2.wechat)";
int other;
cin >> other;
cin.ignore(256, '\n');switch(other){case 1:{cout << "请输入联系人QQ号: ";string QQ_number;getline(cin, QQ_number);p->set_qq(QQ_number);break;}case 2:{cout << "请输入联系人微信号: ";string wechat_number;getline(cin, wechat_number);p->set_wechat(wechat_number);break;}default:break;
}

image-20230611092859657

read.cc

// 方式一:用 has 方法判断字段是否被设置
if(people.has_qq()){cout << "qq号: " << people.qq() << endl;
}else if(people.has_wechat()){cout << "微信号: " << people.wechat() << endl;
}// 方式二:使用 case 方法直接返回被设置的字段。扩展性更好
switch(people.other_contact_case()){case contact2::PeopleInfo::OtherContactCase::kQq:{cout << "qq号: " << people.qq() << endl;break;}case contact2::PeopleInfo::OtherContactCase::kWechat:{cout << "微信号: " << people.wechat() << endl;break;}
}

image-20230611092949747


在这里插入图片描述


http://www.ppmy.cn/news/325484.html

相关文章

【Python】Python进阶系列教程-- 内置函数(十一)

文章目录 前言内置函数 前言 往期回顾&#xff1a; Python进阶系列教程-- Python3 正则表达式&#xff08;一&#xff09;Python进阶系列教程-- Python3 CGI编程&#xff08;二&#xff09;Python进阶系列教程-- Python3 MySQL - mysql-connector 驱动&#xff08;三&#xf…

【C/C++】函数指针

简介 如果在程序中定义了一个函数&#xff0c;那么在编译时系统就会为这个函数代码分配一段存储空间&#xff0c;这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放&#xff0c;这个指针变量就叫作函数指针…

MindMapper 思维导图 21.x

MindMapper 可视化绘图软件是任何想要快速组织思想和想法的人的必备工具。MindMapper 具有易于使用的界面&#xff0c;可以轻松创建可用于头脑风暴、决策制定和项目管理的综合思维导图。MindMapper 还是一个非常强大的生产力工具&#xff0c;因为它允许用户跟踪他们在项目和任务…

光缆的分类

光纤光缆基础知识普及—光缆的分类 光缆是怎么分类的&#xff1f; 1 按照使用的光纤类型分为单模光缆和多模光缆。 2 按照缆芯结构可以分为 层&#xff08;壹&#xff09;绞&#xff08;叁&#xff09;式&#xff08;玖&#xff09;光&#xff08;捌&#xff09;缆&#xff08;…

光纤熔接机怎么选?从哪里买价格低服务有保障?

在通信行业&#xff0c;光纤熔接机是一个必不可少的工具&#xff0c;占有举足轻重的地位&#xff1b;光纤的连接/维护等都需要用到它&#xff0c;并且光纤熔接的好与坏直接影响到通信传输的质量&#xff0c;所以一台熔接机的性能质量直接关乎整条线路的通信质量&#xff0c;从而…

光纤线上线缆标识信息解读

光纤线上线缆标识信息解读 光纤线上线缆标识信息解读 型式由5个部分构成&#xff0c;各部分均用代号表示。 S是指光纤松套被覆结构&#xff1b; GYSTA有松套结构&#xff0c;而GYTA没有这种结构&#xff1b; 光缆型号组成、代号、含义 一、分类 GY 通信用室外&#xff08;野…

双绞线、同轴电缆、光纤

传输介质也称为传输媒体&#xff0c;它是发送设备和接受设备之间的物理通路。传输介质可分为导向传输介质和非导向传输介质&#xff0c;在导向传输介质中&#xff0c;电磁波被导向沿着固体媒介&#xff08;铜线或光纤&#xff09;传播&#xff0c;而非导向传输介质可以是空气、…