0

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
4

1 に答える 1

0

メソッドに対して行ったように、クラスに対してvoid f(Object& o)として宣言する必要があります。friendObjectvoid Helper::helper(Object&)

于 2013-06-09T16:42:42.223 に答える