定数ゲッターと非定数ゲッター: エレガントなソリューション
定数バリアントと非定数バリアントを持つオーバーロードされたゲッターは、プログラミングの難題を引き起こします。一方を他方から直接実装するとコンパイル エラーが発生し、開発者はキャストに頼らざるを得なくなります。もっと適切なアプローチはありますか?
課題
getSomething メソッドを含む次のクラスを考えてみましょう:
class Foobar { public: Something& getSomething(int index); const Something& getSomething(int index) const; };
一方のメソッドをもう一方のメソッドを使用して実装するconst バージョンでは非 const バージョンを呼び出すことができないため、これは実行できません。キャストは必要ですが、面倒に感じられ、混乱を招く可能性があります。
解決策: 慎重にキャストしてください
Effective C では、const 関数から const をキャストすることを提案しています。非const関数を実装します。見た目には魅力的ではありませんが、安全なアプローチです。非 const メンバー関数が呼び出されているため、オブジェクトは非 const である必要があり、const のキャストは許可されます。
例を次に示します。
class Foo { public: const int& get() const; int& get(); }; const int& Foo::get() const { // Non-trivial work return foo; } int& Foo::get() { return const_cast<int&>(const_cast<const Foo*>(this)->get()); }
このアプローチに従ってください。を使用すると、パフォーマンスを犠牲にしたり、不必要な複雑さを導入したりすることなく、タイプセーフな const および非 const ゲッターの実装を実現できます。
以上が定数ゲッターと非定数ゲッター: キャストより良い方法はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。