Я новичок в Google Probubu и что узнать, есть ли разница между следующими методами:
1)
foo.mutable_bar()->set_somefield(...)
а также
2)
nestedmsg = foo.bar();
nestedmsg.set_somefield() (where bar is message)
?
Как я обнаружил, foo.bar () не работает для меня. Разница в документации заключается в том, что изменяемый вызов возвращает указатель вместо default_instance. Но почему второй способ не работает?
Ваша вторая версия не должна даже компилироваться: bar()
возвращает константную ссылку, но set_somefield()
это не постоянный метод. Не использовать const_cast
обойти это!
Разница между методами заключается в том, что mutable_bar()
на самом деле инициализирует bar
поле с новым вложенным сообщением, если его еще нет. То есть если has_bar()
всегда вернется true
после mutable_bar()
даже если бы это было false
перед рукой. bar()
, с другой стороны, никогда не изменяет сообщение, поэтому не влияет has_bar()
, Если bar
поле не установлено, тогда bar()
возвращает ссылку на экземпляр по умолчанию типа, который вы должны никогда изменить — вот почему это const.
Если вам нужно изменить под-сообщение, вы всегда должны использовать mutable_
вариант. Не волнуйтесь, он никогда не возвращает нулевой указатель.
Других решений пока нет …