2009-07-11 3 views
0

私のアプリケーションの多くの異なる画面は、同じエンティティ/ビジネスオブジェクトを何度も繰り返し参照しています。
現在、各画面は各オブジェクトの独自のコピーを参照します。
また、エンティティオブジェクト自体が他のエンティティオブジェクトへのアクセスを公開する可能性があり、オブジェクトの新しいコピーが作成されます。
私はキャッシュソリューションを見つけようとしています。キャッシュデザイン:不変のキーに基づく可変エンティティオブジェクトのフライウェイト

私はboost :: flyweightと似た何かを探しています。
しかし、不変のキー/変更可能な値と参照カウントに基づいています。

boost::flyweight<key_value<long, SomeObject>, tag<SomeObject> > object; 

上記はほぼ完全です。 SomeObjectへの変更可能なアクセスを与える同様のコンテナを探しています

編集: 私はフライウェイトの構文とセマンティクスが好きです。しかし、フライウェイトは const SomeObject &にアクセスするだけで、オブジェクトを変更することはできません。

EDIT2:コードはMSVC++ 6

上の任意のアイデアをコンパイルする必要がありますか?

+0

"上記はほぼ完璧です" - 何が問題なのですか? –

+0

flyweightはオブジェクトへのconstアクセスのみを許可します(const SomeObject&) –

+0

フライウェイトごとの外部情報を追加するか、共有固有情報を変更するために変更可能にしますか? – p00ya

答えて

1

内在的な状態に影響を与えているのであれば、boost/flyweight/key_value.hppの内部からは、const_castで取り除くことができるようです。独自のキーエクストラクタを使用している場合は、xを変更可能にする操作で変更されていないことを確認してください。

flyweight<key_value<long, SomeObject> > kvfw(2); 
SomeObject &x = const_cast<SomeObject &>(static_cast<const SomeObject&>(kvfw)); 
+0

私はMSVC++ 6でコンパイルする必要があります。私はそれを要件として置くべきだった。 –

+0

これはかなりうまくいく。私はオペレータのキャストを隠した - >とoprator * –

0

フライウェイトを変更可能にすると、合法的にフライウェイトと呼ぶことはできません。グリフがフライウェイトとして表される状況を想像してみてください。ある関数が文字 'A'を表すグリフのコードポイントを変更するとどうなりますか?スクリーン上のグリフをレンダリングするもう1つの関数は、 'A'を描画しようとし、ユーザーは 'B'か何かを見ることになるかもしれません!変更可能なオブジェクトを参照する不変のキーが必要だと思います。次に、いくつかの参照カウント機構と結合されたhash tableを使用することを考える。

+0

私はあなたのポイントを取得します。フライウェイトは何をするのですか?参照カウントされたオブジェクトの静的ハッシュテーブルを提供しますか?私はフライウェイトの構文が似ているので、似たようなものを見つけたいと思っています。 –

関連する問題