#c #reflection #protocol-buffers
Вопрос:
Я анализирую сообщение с помощью прото-файла во время выполнения. Я создал «прототипное сообщение» и попытался получить информацию об отражении каждого поля. когда дело доходит до вложенного сообщения, мне нужно AddMessage
получить внутренние поля.
// протофайл
message A {
int32 a1 = 1;
string a2 = 2;
};
message B {
repeated A b1 = 1;
int64 b2 = 2;
};
Class ProtoType {
Message* msg;
BizX* biz_x;
void Init(const std::stringamp; proto_file_path) {
// parse from file to get msgDesc
auto* factory = new google::protobuf::DynamicMessageFactory();
factory->SetDelegateToGeneratedFactory(true);
msg= mFactory->GetPrototype(msgDesc);
}
void InitRefl() {
biz_x = new BizX();
biz_x->Init(*(msg->New()));
}
};
class BizX {
BizY* biz_y;
Reflection* refl;
Descriptor* desc;
void Init(const Messageamp; msg) {
refl = msg.GetReflection();
desc = msg.GetDescriptor();
const auto* field_desc = desc->FindFieldByName("b1");
auto* p = msg.New();
auto* tmp = refl->AddMessage(p, field_desc);
biz_y = new BizY();
biz_y->Init(msg);
}
};
class BizY {
Reflection* refl;
Descriptor* desc;
void Init(const Messageamp; msg) {
refl = msg.GetReflection();
desc = msg.GetDescriptor();
const auto* field_desc = desc->FindFieldByName("b1");
auto* p = msg.New();
auto* tmp = refl->AddMessage(p, field_desc); // crash!!!:pure virtual method called
}
};
int main() {
ProtoType* p = new ProtoType();
p->Init("proto-file")
p->InitRefl();
return 0;
}
Я думал BizY::Init
, что должен был получить тот же результат, BizX::Init
что и, но он разбился, почему?