【问题标题】:How to declare a CAPnPROTO builder before initialzing it in c++?如何在 C++ 中初始化之前声明一个 CAPnPROTO 构建器?
【发布时间】:2019-01-15 16:17:36
【问题描述】:

我是 CAP'N PROTO 的新手。我已经创建了 cap'n proto 结构和下面提到的结构的一部分:

**struct InjectorRequestMsg {
dataFrame @0: InjectorDataFrame;  
injectorRequestID @1: UInt32;
injectorID @2: UInt32;
injectorScriptPath @3: Text;
injectorFuncName @4: Text;
injectorLogPath @5: Text;

}**

然后,我在我的 C++ 代码中编写一个构建器,如下所示:
::capnp::MallocMessageBuilder message; InjectorRequestMsg::Builder injectorRequestMsg = message.initRoot<InjectorRequestMsg>();

然后,后续分配也可以正常工作,我可以设置所有值。 但是,当我尝试像
InjectorRequestMsg::Builder injectorRequestMsg; injectorRequestMsg = message.initRoot<InjectorRequestMsg>();

一样声明和初始化 InjectorRequestMsg::Builder

然后,它给出以下错误: capnproto/InjectorMessage.capnp.h:197:3:错误:在此处声明 建造者()=删除; // 删除以阻止不正确的使用。

因此,请您帮助我了解如何在两个不同的步骤中声明和初始化 InjectorRequestMsg::Builder injectorRequestMsg,以便我将 InjectorRequestMsg::Builder injectorRequestMsg 作为 C++ 类和所有成员函数的数据成员C++类可以访问吗?

【问题讨论】:

  • 从消息中您根本无法分两步完成。我认为您在询问类成员,您不需要在构造函数中使用injectorRequestMsg = message.initRoot&lt;InjectorRequestMsg&gt;();,请查看member initialisation lists

标签: c++11 capnproto


【解决方案1】:

你可以这样做:

InjectorRequestMsg::Builder injectorRequestMsg = nullptr;

Cap'n Proto 库通常会强制您显式初始化为 nullptr,以此表示:“我还没有准备好初始化它。”它特别希望在未初始化的情况下使用会使进程崩溃的类型,以使其难以搞砸。相比之下,Reader 类型不需要显式初始化,因为默认构造函数可以初始化 Reader 以表示结构的默认值。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多