C++ 封装和信息隐藏的更好选择

C++ 封装和信息隐藏的更好选择,c++,c++11,C++,C++11,我有一个框架,用户可以通过覆盖一些接受对象引用的成员函数来实现。除了Framework::f()之外,不允许用户从这些函数中调用Object::do\u something()。为了实现这个需求,我必须引入一个带有静态成员函数的Helper类,如下例所示。我想知道有没有更短或更干净的 class Object; struct Framework { // the interface is fixed protected: virtual void f(Object& o); /

我有一个
框架
,用户可以通过覆盖一些接受
对象
引用的成员函数来实现。除了
Framework::f()
之外,不允许用户从这些函数中调用
Object::do\u something()
。为了实现这个需求,我必须引入一个带有静态成员函数的
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

可能您应该声明
void f(Object&o)
Object
类的
friend
,就像您对
void Helper::Helper(Object&)
方法所做的那样。

为什么不将对象只传递给那些允许使用它的函数(如
f
),而不传递给其他函数(
g
)?因为允许g调用object的其他成员函数,所以您的问题没有明确说明这一点。我认为最好是显式声明。@maverik我在object中添加了另一个公共成员函数,您可以声明
Framework
的接口是固定的。
对象
的接口有多固定?你能重构它吗?因为
do\u something()
是私有的,那么
f()
如何调用它呢?