protobuf: 通讯录2.3

1.proto3

5.oneof
oneof 的作用:消息中有很多可选字段,并且将来同时 只有⼀个字段会被设置,那么就可以使⽤ oneof 加强这个⾏为,也能有节约内存的效果。
注意:
  • 可选字段中的字段编号,不能与⾮可选字段的编号冲突。(就是得顺着往下编号,和enum从0编号不一样)
  • 不能在oneof中使⽤repeated字段。
  • 将来在设置oneof字段中值时,如果将oneof中的字段设置多个,那么只会保留最后⼀次设置的成员之前设置的oneof成员会⾃动清除。

2.通讯录2.3:用oneof类型定义other_contact(其他联系方式)

contacts.proto
 oneof other_contact
    {
      string qq = 5;   //不能用repeated 数组,会编译错误
      string wechat = 6;
    }

write.cc(只展示新增部分)

std::cout << "请输入联系人的其他联系方式: (0.qq  1.微信)";
    int other_contact;
    std::cin >> other_contact;
    std::cin.ignore(256, '\n');

    if (other_contact == 0)
    {
        std::cout << "请输入联系人的qq: ";
        std::string qq;
        getline(std::cin, qq);
        person->set_qq(qq);
    }
    else if (other_contact == 1)
    {
        std::cout << "请输入联系人的微信: ";
        std::string wechat;
        getline(std::cin, wechat);
        person->set_wechat(wechat);
    }
    else
        std::cout << "选择有误,未成功选择其他联系方式" << std::endl;

read.cc(只展示新增部分)

switch(person.other_contact_case())
        {
            case contacts::People::OtherContactCase::kQq:
                std::cout << "联系人的qq是: " << person.qq() << std::endl;
                break;
            case contacts::People::OtherContactCase::kWechat:
                std::cout << "联系人的微信是: " << person.wechat() << std::endl;
                break;
            default:
                break;   
        }

解释:

other_contact_case(): 作用是返回一个枚举常量,让我们知道哪个 oneof 字段被设置了,下面判断的时候可以用到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值