へFramework
の参照を受け入れるいくつかのメンバー関数をオーバーライドすることで、ユーザーが実装できる がありますObject
。ユーザーは、Object::do_something()
を除くこれらの関数から呼び出すことはできませんFramework::f()
。この要件を実装するHelper
には、次の例のように、静的メンバー関数を持つクラスを導入する必要がありました。短くてきれいなものがあるのだろうか。
class Object;
struct Framework { // the interface is fixed
protected:
virtual void f(Object& o); // f is allowed to call o.do_something()
virtual void g(Object& o); // g is not allowed to call o.do_something()
friend class Helper;
};
class Helper { // Helper class to make things work as wanted
friend class Object;
friend void Framework::f(Object&);
static void helper(Object&);
};
class Object {
void do_something() {}
friend void Helper::helper(Object&);
public:
void do_something_else() {}
};
void Helper::helper(Object& o) {o.do_something();}
// user implementation
void Framework::f(Object& o) {Helper::helper(o);}
void Framework::g(Object& o) {o.do_something_else(); /*Helper::helper(o);*/} // o.do_something() denied