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 字段被设置了,下面判断的时候可以用到。