Как объявить конструктор CAPnPROTO перед его инициализацией в c ++? - PullRequest
0 голосов
/ 15 января 2019

Я новичок в 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::Builder injectorRequestMsg; injectorRequestMsg = message.initRoot<InjectorRequestMsg>();

Тогда выдает ошибку ниже: capnproto / InjectorMessage.capnp.h: 197: 3: ошибка: объявлено здесь Builder () = удалить; // Удалено, чтобы препятствовать неправильному использованию.

Следовательно, не могли бы вы помочь мне понять, как я могу объявить и инициализировать InjectorRequestMsg :: Builder injectorRequestMsg за два разных шага, чтобы я сделал InjectorRequestMsg :: Builder injectorRequestMsg в качестве члена-данных класса C ++ и всех функций-членов класс C ++ может получить к нему доступ?

1 Ответ

0 голосов
/ 24 января 2019

Вы можете сделать:

InjectorRequestMsg::Builder injectorRequestMsg = nullptr;

Библиотека Cap'n Proto часто вынуждает вас явно инициализировать nullptr, чтобы сказать: «Я еще не готов инициализировать это». Это особенно необходимо для типов, которые могут привести к сбою процесса, если он используется неинициализированным, чтобы его было сложно испортить. Напротив, Reader типы не нужно явно инициализировать, потому что конструктор по умолчанию может инициализировать Reader для представления значения структуры по умолчанию.

...