メッセージ
以下のような簡単なメッセージ定義から:
message Foo {}
プロトコルバッファコンパイラは、google::protobuf::Message を public継承した Fooクラスを生成します。このクラスは未実装の純粋仮想関数の無い、具象クラスとなっています。
Message の純粋でない仮想関数は、Fooクラスでオーバーライドされているものも、されていないものもあります。何かオーバーライドされるかは最適化モードに依ります。
デフォルトでは、Fooは必要最低限のメソッドだけを実装しています。ですが、.protoファイルが次の行を含んでいた場合:
option optimize_for = SPEED;
Fooはすべての仮想関数を、生成される高速な実装でオーバーライドします。
これは生成コードサイズをかなり増大させるので、プロファイラが必要性を示した場合にのみ利用すべきです。
Foo の独自のサブクラスを作ら *ない* ようにすべきです。
もしサブクラスを作って仮想関数をオーバーライドしても、多くの生成されたメソッドの呼び出しはパフォーマンス向上のために非仮想化されるので、そのオーバーライドは無視されます。
Messageインターフェースで定義されたメソッドに加えて、
Fooは以下のメソッドを定義します:
- Foo()
- デフォルトコンストラクタ。
- ~Foo()
- デフォルトデストラクタ。
- Foo(const Foo& other)
- コピーコンストラクタ。
- Foo& operator=(const Foo& other)
- 代入オペレータ。
- const UnknownFieldSet& unknown_fields() const
- メッセージの解析時に出くわした未知のフィールドの集合を返します。
- UnknownFieldSet* mutable_unknown_fields()
- メッセージの解析時に出くわした道のフィールド集合の、変更可能なポインタを返します。
Foo は次の静的メソッドも定義します:
- static const Descriptor& descriptor()
- この型のディスクリプタを返します。ディスクリプタは、この型のフィールドや、この型が何の型なのかといった、型についての情報を含みます。これは、フィールドをプログラム的に調べるために、リフレクションと共に使われます。
- static const Foo& default_instance()
- 新しく構築された Fooインスタンスと同一の、constなシングルトンインスタンスを返します(ですので、一個要素のフィールドは未セットで、repeatedフィールドは空になっています)。メッセージのデフォルトインスタンスは、New()メソッドを呼ばれることでファクトリとしてつかわれることに注意してください。
以下の例のように、メッセージは別のメッセージの中に宣言することができます:
message Foo {
message Bar {
}
}
この例では、コンパイラは二つのクラスを生成します:
Foo と
Foo_Bar.
さらに、コンパイラは
Foo の中に以下のような typedef を生成します:
typedef Foo_Bar Bar;
このことは、ネストされたメッセージのクラスを Foo::Bar というネストされたクラスのように使えることを意味します。だが、C++ はネストされた型の前方宣言を許していないことに注意が必要です。
別のファイル中に Bar を前方宣言したい場合は、Foo_Bar で指定しなければなりません。