首页 > 解决方案 > 无法通过 copyin 而不是 set_allocated_something 来设置 protobuf 元素?

问题描述

在我生成的 protobuf 类中,我只看到set_allocated_something.

例子:

syntax = "proto3";
import "uuid.proto";
import "openvpn.proto";
package message;

message VPN {
    UUID uuid = 1;
    oneof vpn {
        OpenVPN openVPN = 2;
    }
}

然后我有:

OpenVPN openVPN;
//fill openVPN
auto vpnAny = someObject.add_vpns();
vpnAny->set_allocated_openvpn(&openVPN);

以下代码崩溃,因为我正在添加一个我拥有数据的对象,然后set_allocated_openvpn将首先删除它,然后作用域将第二次删除它。

另一种方法是做

OpenVPN* openVPN = new OpenVPN();

但我想避免原始指针 + new

为什么 protobuf 根本不会生成复制数据的方法?为什么我只能传递分配的数据指针?我应该如何处理这种情况?

标签: c++protocol-buffers

解决方案


Protobuf 为每种类型生成复制构造函数和复制赋值运算符。因此,将消息复制到另一个消息的最正常方法是

OpenVPN openVPN;
// (...)
*someObject.add_vpns() = openVPN;

推荐阅读