我已经实现了两个简单的protobuf消息
package TestNamespace;
message Object1 {
int32 age = 1;
int32 speed = 2;
}
message Object2 {
Object1 obj = 1;
int32 page_number = 2;
}
然后我有两个protobuf对象的包装类。 在Object2Wrapper内部,当我调用ToProtobuf返回析构函数时,由于某种原因我无法理解它在obj1上被调用。
class Object1Wrapper
{
public:
int32_t Age{};
int32_t Speed{};
void ToProtobuf(TestNamespace::Object1 obj1)
{
obj1.set_age(Age);
obj1.set_speed(Speed);
//After this line the ~destructor is called on obj1
}
};
class Object2Wrapper{
public:
Object1Wrapper obj1{};
int32_t page_number{};
void ToProtobuf(TestNamespace::Object2 obj2Param)
{
TestNamespace::Object1 * obj1Proto = obj2Param.mutable_obj();
obj1::ToProtobuf(*obj1Proto);
// Do stuff.... but obj1Proto is empty
}
};
答案 0 :(得分:2)
原因是您按值传递对象obj1
。创建参数的副本,并在函数返回时销毁此副本。\
我猜你真正想做的是通过引用传递对象。即
void ToProtobuf(TestNamespace::Object1& obj1)
{
obj1.set_age(Age);
obj1.set_speed(Speed);
//After this line the ~destructor is called on obj1
}
只有在通过引用传递时,才能更改函数内的对象。正如您现在所做的那样,对函数内obj1
的任何更改都不会对传递给函数的参数产生任何影响。