我仍在努力了解如何使用谷歌协议缓冲库,所以我希望你能原谅我的疏忽,如果这是题外话。
我想 Package GoogleProtoFactory,使消息类型放在unique_ptrs中,这样就不必担心内存管理。
这是我的
ProtoBufFactory::ProtoBufFactory() {
Anon::Protocol_descriptor();
Auth::Protocol_descriptor();
m_factory = ::google::protobuf::MessageFactory::generated_factory();
}
//https://stackoverflow.com/questions/29960871/protobuf-message-object-creation-by-name
std::unique_ptr<::google::protobuf::Message> ProtoBufFactory::create(const ::google::protobuf::Descriptor * msg_descriptor) {
const ::google::protobuf::Message * prototype_msg = m_factory->GetPrototype( msg_descriptor );
if (prototype_msg == nullptr) {
EXCEPT(1, "Cannot create prototype message from message descriptor");
}
::google::protobuf::Message * mutable_msg = prototype_msg->New();
if (mutable_msg == NULL) {
EXCEPT(1, "Failed in prototype_msg->New(); to create mutable message");
}
return std::make_unique<::google::protobuf::Message>(mutable_msg);
}
我收到一个错误,指出我不能这样做,因为我正在对一个抽象类型进行操作。
error: invalid new-expression of abstract class type ‘google::protobuf::Message’
857 | { return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); }
/include/google/protobuf/message.h:235:23: note: because the following virtual functions are pure within ‘google::protobuf::Message’:
235 | class PROTOBUF_EXPORT Message : public MessageLite {
| ^~~~~~~
/usr/local/include/google/protobuf/message.h:244:12: note: ‘virtual google::protobuf::Message* google::protobuf::Message::New() const’
244 | Message* New() const override = 0;
/usr/local/include/google/protobuf/message_lite.h:465:15: note: ‘virtual int google::protobuf::MessageLite::GetCachedSize() const’
465 | virtual int GetCachedSize() const = 0;
/usr/local/include/google/protobuf/message.h:367:20: note: ‘virtual google::protobuf::Metadata google::protobuf::Message::GetMetadata() const’
367 | virtual Metadata GetMetadata() const = 0;
我被这个错误信息弄糊涂了。有一个reddit帖子报道了一个与google protobuf无关的类似错误:https://www.reddit.com/r/cpp_questions/comments/goa2he/stdunique_ptr_stdmake_unique_and_abstract_classes/
这似乎是因为子类缺少抽象类的实现。我认为这可能是一个链接器的问题,但从我可以告诉我链接的是C++ protobuf生成的文件。
我不太确定如何最好地处理这个问题,甚至不确定unique_ptrs在这种情况下是否都是有益的。
我希望有一种简单的方法来创建一个unique_ptr到Google协议缓冲区消息,这样我就不必担心显式删除它们。
2条答案
按热度按时间u2nhd7ah1#
std::make_unique
命名错误。它应该是std::emplace_unique_ptr
。它创建对象 * 并 * 为其分配空间 * 并 * 将其存储在一个智能指针中。
因为已经有了一个对象 * 和 * 空间,所以不用
make_unique
:而是改为仅使
unique_ptr
Package 指针。js4nwp542#
您已经在
return
之上构造了mutable_msg
,不需要尝试创建另一个对象的std::make_unique()
,只需返回已有的指针,让编译器返回由该指针构造的std::unique_ptr<::google::protobuf::Message>
:if (prototype_msg == nullptr)
看起来不错。if (mutable_msg == NULL)
看起来并不好看。