1

キャッシュとして機能するクラスがあります。次のプライベート メンバーがあります。

std::map<std::string, Foo> _cache;

キャッシュに格納されている Foo オブジェクトへの参照、ポインター、イテレーター、またはスマート ポインターを返す、このキャッシュのゲッターを作成する必要があります。必要に応じて、getter を介してクライアントが Foo オブジェクトを更新できるようにします。

ただし、アイテムがキャッシュに見つからない場合、ゲッターがスローすることは望ましくありません。代わりに、クライアントは返された値をテストして、アイテムが見つかったかどうかを判断する必要があります。ただし、このアプローチをお勧めする場合は、投げることを確信できます。

私のゲッターにどの戻り値の型をお勧めしますか?

ブーストと C++98 を使用しています。

4

3 に答える 3

2

あなたの場合、ヌルポインターを返す可能性があるため、参照は問題外です。プライベートメンバーであるキャッシュの .end() 関数にアクセスせずに実際に要素を指している場合、テストできないため、イテレータも使用できません。テストするためのインターフェースを提供しない限り、それはやり過ぎです。

他の唯一のオプションは、ポインターを返すことです。ただし、その方法では、呼び出し元が使用している間ずっとポインターが有効であることを保証する必要があります。これを行う 1 つの方法は、共有ポインターのマップを実装することです。つまり、次のようになります。

std::map<std::string, boost::shared_ptr<Foo> > _cache;

そうすれば、オブジェクトがキャッシュからスローされても、呼び出し元には有効なポインターが残ります。また、shared_ptr は bool テストできるため、アイテムがキャッシュで見つからない場合は、空の shared_ptr を返すことができます。

しかし、キャッシュのコンテキストについてはほとんど知られていないため、詳細を知ることはできません (たとえば、同期が必要かどうかなど)。

于 2013-04-19T12:17:27.497 に答える