2013-12-05 2 views
5

Мой .proto файл выглядитбуферы протокола каст Встроенное сообщение

message Cmd 
{ 
     int code = 1; 
} 

message CmdOne 
{ 
     required Cmd cmd = 1; 
     required int data = 2; 
} 

message CmdTwo 
{ 
     required Cmd cmd = 1; 
     required string data = 2; 
} 

В моем файле CPP, я хочу объявить объекты CmdOne и CmdTwo и установить оба cmd и data членов. Но сгенерированный файл pb.h не имеет установленного метода для члена cmd объектов CmdOne и CmdTwo, но имеет метод set для члена data. Как установить значение cmd для каждого объекта?

Я не хочу определять сообщение Cmd внутри CmdOne и CmdTwo сообщений. Я хочу повторно использовать сообщение Cmd, поскольку у меня есть 10 сообщений CmdOne - CmdTen.

ответ

13

У вас есть несколько различных вариантов. Вы можете получить неконстантный указатель на cmd поля, а затем выделить значение (ы) соответственно:

CmdOne cmd_one; 
Cmd* cmd(cmd_one.mutable_cmd()); 
cmd->set_code(2); 
// Previous 2 lines could be simplified to: 
// cmd_one.mutable_cmd()->set_code(2); 

Alternativey, если вы хотите передать построенный экземпляр Cmd в CmdOne, вы можете сделать:

Cmd* cmd(new Cmd); 
cmd->set_code(1); 

CmdOne cmd_one; 
cmd_one.set_allocated_cmd(cmd); // Takes ownership of cmd - 
           // you don't call 'delete cmd' 

в разделе "болванка Embedded Message Поля" из the docs:

Учитывая тип сообщения:

message Bar {} 

Для любого из этих определений полей:

optional Bar foo = 1; 
required Bar foo = 1; 

компилятор будет генерировать следующие методы доступа:

...

Bar* mutable_foo() 

Возвращает изменяемый указатель на Bar объект, который сохраняет значение поля. Если поле не было установлено перед вызовом, то возвращаемый Bar не будет иметь ни одного из его полей (т. Е. Он будет идентичен вновь выделенному Bar). После этого has_foo() вернет true и foo() вернет ссылку на тот же экземпляр Bar. Указатель недействителен по вызову Clear() или clear_foo().

...

void set_allocated_foo(Bar* bar) 

Устанавливает Bar объект в поле и освобождает предыдущее значение поля, если оно существует. Если указатель Bar не является NULL, сообщение переходит в собственность выделенного объекта Bar, а has_foo() вернет true. В противном случае, если Bar равен NULL, поведение будет таким же, как и при вызове clear_foo().

+0

Как я могу создать файл сообщений, как в ОП, из моего кода C++. У меня есть входной файл xml, который я обрабатывал с помощью программы на C++ и заполнял структуры данных. Есть ли способ создать файл сообщения автоматически из моего кода на C++? Благодаря – k2ibegin

-1
Cmd my_command; 

theCommand.set_code(5); 

CmdOne cmd_one; 

cmd_one.mutable_cmd().copyFrom(my_command); 
Смежные вопросы