2012-04-06 21 views
1

私は現在、いくつかのクラスのメンバ変数をシリアライザにバインドするためにプロパティシステムを設計しようとしていますが、各バインディングに対して可能な限りコードを書いていますが、柔軟性があります。C++のメンバ変数をバインドする:getter/setterまたはrawポインタ?

ゲッター/セッターは実際にはほとんど必要ないと思うので、実際にゲッター/セッターが実際にトリガーするときにのみ使用されます。クラスは変数名のリストと、変数へのポインタ、getters/setterへのポインタのいずれかを提供します。

私の質問は以下のとおりです。

  • は、実際に危険な、あるいは道徳的なポインタによって結合されていますか?
  • これらのクラスは実際のインスタンスを知らなくてもこれらのポインタを与えることができますか? (つまり、各クラスのすべてのインスタンスに対して一度バインディング情報を取得し、どこかに格納します)。 AFAIK、Boost :: bindはそれを許可しません。

答えて

0

危険はい、不道徳なしの使用を検討すべきです。クラスをシリアライザの友人にすることができ、安全性を向上させるために致命的な人のための拘束物を隠すことができます。次に、互いの内部構造について倫理的に認められている関連クラスのセットがあります。

クラスは、バイトオフセットなどのバインディング情報を確実に返すことができます。クラスがそのクラスの "プロトタイプ"オブジェクト(つまり、独自の型の静的メンバー)を所有している場合は、最も簡単です。次に、プロトタイプフィールドのアドレスをconst char *として取得し、プロトタイプのアドレスからconst char *を減算すると、フィールドのバイトオフセットが取得されます。

もちろん、フィールドのタイプを知っていることを確認して、バイトオフセットが与えられたデータを正しく操作できるようにする必要があります(正しいポインタタイプにキャストなど)。

しかし、オブジェクト内のいくつかのサブオブジェクトへのポインタではなく、シリアライズ時に正しいポインタ型を持つようにすることを中心に、このようなものを実装するのには多くの問題があります。

関連する問題