Protocol-Buffers C++语法问题:无法设置Student的sName与添加sInfo
解决Protobuf C++中设置嵌套消息和添加重复消息的语法问题
你的问题核心是对Protobuf自动生成的C++方法命名规则不熟悉,以下是具体修正方案:
1. 正确设置Student的sName字段
Proto文件中Student的sName字段是嵌套消息类型,Protobuf会生成mutable_sname()方法来获取该嵌套消息的可修改指针,再通过CopyFrom()复制已有FullName对象的数据:
// 替换原错误代码 student1.set_name(name1); student1.mutable_sname()->CopyFrom(name1);
如果不需要提前创建FullName对象,也可以直接在mutable_sname()上设置字段:
student1.mutable_sname()->set_surname("Sergeev"); student1.mutable_sname()->set_name("Sergey"); student1.mutable_sname()->set_patronymic("Sergeevich");
2. 正确将Student添加到StudentsGroup的sInfo重复字段
对于repeated Student sInfo这种重复字段,Protobuf生成的add_sinfo()方法会返回一个新创建的Student对象指针,你可以直接将已有student1的数据复制到这个新对象中:
// 替换原错误代码 group1.add_sinfo(student1); *group1.add_sinfo() = student1;
也可以用CopyFrom()实现相同效果:
group1.add_sinfo()->CopyFrom(student1);
修正后的完整代码
#include <iostream> #include "Students.pb.h" int average(const google::protobuf::RepeatedField<int32_t>& grades) { int32_t s = 0; for (const int& i : grades) { s = s + i; } return s/grades.size(); } int main() { FullName name1; name1.set_surname("Sergeev"); name1.set_name("Sergey"); name1.set_patronymic("Sergeevich"); std::cout << name1.name() << std::endl; Student student1; student1.mutable_sname()->CopyFrom(name1); student1.add_grade(4); student1.add_grade(3); student1.set_averagemark(average(student1.grade())); StudentsGroup group1; *group1.add_sinfo() = student1; }
补充规则说明
- Protobuf C++方法命名规则:proto文件中的驼峰命名字段(如
sName)会转为小写加下划线形式(sname),对应生成mutable_sname()(嵌套消息)、add_grade()(重复字段)、set_averagemark()(普通字段)这类方法。 - 嵌套消息类型必须通过
mutable_xxx()获取可修改对象指针,不能直接用set_xxx()(内存管理场景除外)。 - 重复字段的
add_xxx()方法自动创建新元素并返回指针,通过赋值或CopyFrom()完成数据复制。
内容的提问来源于stack exchange,提问作者Zetton
相关产品推荐
相关产品推荐

