C++ 为什么c++;对于重复的protobuf场?

C++ 为什么c++;对于重复的protobuf场?,c++,protocol-buffers,C++,Protocol Buffers,我正在使用以下.proto文件: message Header { enum MessageType { UNKNOWN = 0; CONNECT = 1; DISCONNECT = 2; UPDATE = 3; REQUEST = 4; SUBSCRIBE = 5; UNSUBSCRIBE = 6; } required MessageType msg

我正在使用以下
.proto
文件:

message Header
{
    enum MessageType
    {
        UNKNOWN = 0;
        CONNECT = 1;
        DISCONNECT = 2;
        UPDATE = 3;
        REQUEST = 4;
        SUBSCRIBE = 5;
        UNSUBSCRIBE = 6;
    }
    required MessageType msgType = 1;
}

message DataSet
{
    optional string id = 1;
    optional string value = 2;
}

message StdMessage
{
    required Header header = 1;
    repeated DataSet dataSet = 2;
}
以下是已编译的StdMessage类:

class StdMessage : public ::google::protobuf::Message {
 public:
  StdMessage();
  virtual ~StdMessage();

  StdMessage(const StdMessage& from);

  inline StdMessage& operator=(const StdMessage& from) {
    CopyFrom(from);
    return *this;
  }

  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
    return _unknown_fields_;
  }

  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
    return &_unknown_fields_;
  }

  static const ::google::protobuf::Descriptor* descriptor();
  static const StdMessage& default_instance();

  void Swap(StdMessage* other);

  // implements Message ----------------------------------------------

  StdMessage* New() const;
  void CopyFrom(const ::google::protobuf::Message& from);
  void MergeFrom(const ::google::protobuf::Message& from);
  void CopyFrom(const StdMessage& from);
  void MergeFrom(const StdMessage& from);
  void Clear();
  bool IsInitialized() const;

  int ByteSize() const;
  bool MergePartialFromCodedStream(
      ::google::protobuf::io::CodedInputStream* input);
  void SerializeWithCachedSizes(
      ::google::protobuf::io::CodedOutputStream* output) const;
  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
  int GetCachedSize() const { return _cached_size_; }
  private:
  void SharedCtor();
  void SharedDtor();
  void SetCachedSize(int size) const;
  public:

  ::google::protobuf::Metadata GetMetadata() const;

  // nested types ----------------------------------------------------

  // accessors -------------------------------------------------------

  // required .Header header = 1;
  inline bool has_header() const;
  inline void clear_header();
  static const int kHeaderFieldNumber = 1;
  inline const ::Header& header() const;
  inline ::Header* mutable_header();
  inline ::Header* release_header();

  // repeated .DataSet dataSet = 2;
  inline int dataset_size() const;
  inline void clear_dataset();
  static const int kDataSetFieldNumber = 2;
  inline const ::DataSet& dataset(int index) const;
  inline ::DataSet* mutable_dataset(int index);
  inline ::DataSet* add_dataset();
  inline const ::google::protobuf::RepeatedPtrField< ::DataSet >&
      dataset() const;
  inline ::google::protobuf::RepeatedPtrField< ::DataSet >*
      mutable_dataset();

  // @@protoc_insertion_point(class_scope:StdMessage)
 private:
  inline void set_has_header();
  inline void clear_has_header();

  ::google::protobuf::UnknownFieldSet _unknown_fields_;

  ::Header* header_;
  ::google::protobuf::RepeatedPtrField< ::DataSet > dataset_;

  mutable int _cached_size_;
  ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];

  friend void  protobuf_AddDesc_xplane_2eproto();
  friend void protobuf_AssignDesc_xplane_2eproto();
  friend void protobuf_ShutdownFile_xplane_2eproto();

  void InitAsDefaultInstance();
  static StdMessage* default_instance_;
};
// -------------------------------------------------------------------
class StdMessage:public::google::protobuf::Message{
公众:
StdMessage();
虚拟~StdMessage();
StdMessage(conststdmessage&from);
内联StdMessage和运算符=(常量StdMessage和from){
抄袭自;
归还*这个;
}
内联常量::google::protobuf::UnknownFieldSet和unknown_fields()常量{
返回(未知)(字段);;
}
inline::google::protobuf::UnknownFieldSet*可变_未知_字段(){
返回和未知字段;
}
静态常量::google::protobuf::描述符*描述符();
静态常量StdMessage&default_instance();
无效交换(StdMessage*其他);
//实现消息----------------------------------------------
StdMessage*New()常量;
void CopyFrom(const::google::protobuf::Message&from);
void MergeFrom(const::google::protobuf::Message&from);
作废CopyFrom(const StdMessage&from);
void MergeFrom(const StdMessage&from);
无效清除();
bool是初始化的()常量;
int ByteSize()常量;
布尔合并部分浮点数流(
::google::protobuf::io::CodedInputStream*输入);
void SerializeWithCachedSizes(
::google::protobuf::io::CodeDoutpOutstream*输出)常量;
::google::protobuf::uint8*SerializeWithCachedSizesToArray(::google::protobuf::uint8*输出)常量;
int GetCachedSize()常量{return\u cached\u size;}
私人:
void SharedCtor();
void sharedtor();
void SetCachedSize(int size)常量;
公众:
::google::protobuf::Metadata GetMetadata()常量;
//嵌套类型----------------------------------------------------
//访问者-------------------------------------------------------
//必需。标题=1;
内联bool具有_header()常量;
内联无效清除_头();
静态常数int kHeaderFieldNumber=1;
内联常量::头和头()常量;
内联::标题*可变标题();
内联::标题*发布标题();
//重复。数据集=2;
内联int数据集_size()常量;
内联无效清除_数据集();
静态常量int kDataSetFieldNumber=2;
内联常量::数据集和数据集(int索引)常量;
内联::数据集*可变_数据集(int索引);
内联::数据集*添加_数据集();
内联常量::google::protobuf::RepeatedPtrField<::DataSet>&
dataset()常量;
inline::google::protobuf::RepeatedPtrField<::DataSet>*
可变_数据集();
//@@protoc\u插入点(类\u作用域:StdMessage)
私人:
内联无效集_有_头();
内联无效清除_有_头();
::google::protobuf::UnknownFieldSet\u unknown\u fields\u;
::页眉*页眉;
::google::protobuf::RepeatedPtrField<::数据集>数据集;
可变整数缓存大小;
::google::protobuf::uint32 _有_位[(2+31)/32];
friend void protobuf_AddDesc_xplane_2eproto();
friend void protobuf_AssignDesc_xplane_2eproto();
friend void protobuf_ShutdownFile_xplane_2eproto();
void InitAsDefaultInstance();
静态StdMessage*default\u instance\u;
};
// -------------------------------------------------------------------
在编译/生成的cpp文件中,
set_header
StdMessage
类中没有类似的函数。我的问题是,如何设置
StdMessage
的标题??
提前感谢。

使用mutable\u header()方法获取指向已创建的头实例的指针。

使用mutable\u header()方法获取指向已创建的头实例的指针。

不是mutable\u header()方法返回指向头实例的指针吗?就在这一秒,我也看到了它。但您/smb是否还知道,为什么没有set_头或任何函数?为什么我必须使用这个可变的东西?不确定,但对于重复的实例,它的工作方式类似,您调用add_where(),它将返回一个指针,然后您可以修改它。也许这是一个设计决定,以避免复制数据这里和再次。kk,移动您的评论回答,我会标记它!谢谢!=)不是返回指向header实例的指针的可变_header()方法吗?就在这一秒,我也看到了它。但您/smb是否还知道,为什么没有set_头或任何函数?为什么我必须使用这个可变的东西?不确定,但对于重复的实例,它的工作方式类似,您调用add_where(),它将返回一个指针,然后您可以修改它。也许这是一个设计决定,以避免复制数据这里和再次。kk,移动您的评论回答,我会标记它!谢谢!=)