私は個人的にそのKey
パターンが好きです。
class WannaBeFriend { /**/ };
class WannaBeFriendKey: boost::noncopyable
{
friend class WannaBeFriend;
WannaBeFriendKey () {}
};
そして今:
class LimitedAccess
{
public:
Item& accessItem(const WannaBeFriendKey&) { return mItem; }
private:
Item mItem;
Item mOtherItem;
};
私はこのソリューションが本当に好きです:
- 前方宣言のみが必要です(友情の場合など)
- 友情によって許可された完全なアクセス権はありません。代わりに、クラスライターの完全な制御の下で、制限されたアクセス権のみが許可されます。
- さらに、何に誰からアクセスできるかが完全に明確であるため、デバッグが容易になります
- このアクセスは、次の子クラスに付与できます
WannaBeFriend
:公開する必要があるだけですprotected: static const WannaBeFriend& Key();
(適用される場合とされない場合があります)
そしてもちろん、コンパイラはこの参照の受け渡しを最適化する可能性が非常に高いです。これは目的を果たさないため、設計が破損したり、不要な一時的なものが追加されたりすることはありません:)