封装和信息隐藏的更好替代方案

时间:2013-06-09 15:06:18

标签: c++ c++11

我有一个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

1 个答案:

答案 0 :(得分:0)

您可能应该像void f(Object& o)方法一样为friend类声明Object void Helper::helper(Object&)