C++ OOP只授予对某些类的访问权

C++ OOP只授予对某些类的访问权,c++,oop,C++,Oop,我想实现一个容器类,它只能由我想要的类访问,方式类似于下面的 class ContainerAccess { // empty }; class Container{ private: static void _do_stuff(); static int _value; friend class ContainerAccess; }; 现在我想访问容器数据,如下所示: class Processor: public ContainerAccess {

我想实现一个容器类,它只能由我想要的类访问,方式类似于下面的

class ContainerAccess {
    // empty 
};

class Container{
  private:
    static void _do_stuff();
    static int _value;

    friend class ContainerAccess;
};
现在我想访问容器数据,如下所示:

class Processor: public ContainerAccess {
  public:
    void proccess() {
      Container::_do_stuff();
      Container::_value++;
    }
};

然而,这是行不通的。为什么呢?这是怎么做到的呢?

你的方法是错误的,因为友谊不是遗传的。然而,有一种很好的方法可以解决您试图解决的问题,那就是私有继承

class Container
{
  protected:
    static void _do_stuff();
    static int _value;
};


class ContainerAccess : private Container 
{
    //using _do_stuff();
};

通过这种方式,您可以选择需要使用类容器的任何类,同时还可以防止其他用户使用您的类。

一种可能的替代方法是不将容器的方法设置为私有静态,而是将其仅设置为公共

然后,在主函数中,创建容器的单个实例,并将其传递给需要访问容器提供的功能的方法/类


不提供容器实例的方法将无法操作。

这不会也不会起作用,因为友谊不是。友谊不是继承的@马纳塔那我怎么能这么做?将连接的抽象接口用于Container和ContainerAccess派生项。@Slava此设计没有问题。您可以拥有一个容器类,该类旨在为多个类提供功能。如果这样做有效,则不会限制对一组特定类的访问,而是限制对从ContainerAccess派生的所有内容的访问。通过尝试向ContainerAccess提供友谊并允许任何人从中继承,您有效地注入了一个额外的步骤,通过声明成员为公共成员或受保护成员来获得已经提供的东西。你真的应该重新思考你想要完成什么。我不认为公开容器的方法有助于良好的封装,也不知道这个建议如何真正帮助OP做他想做的事情。@caps重点是公开它们,但不是静态的-可能只给容器一个私有构造函数,类似于非全局可访问的单例。然后,访问权限仅限于通过实例的人。操作是公开的,但受实例限制,而不是操作在任何地方都可以访问,但受友谊限制。@Svalorzen否!公开这些方法肯定不是正确/合适的解决方案。在这种情况下,客户机类应该有一个非公开可见的接口。请参阅我在对该问题的评论中链接的问答。这是关于如何摆脱“朋友”关系的更一般的方法。@πάνταῥεῖ 如果你能暗示为什么这个解决方案是不正确的,而不是仅仅说明,我想你的评论会更有用。我看不出我的解决方案如何无法将访问功能的权限仅限于容器实例提供的设施。@Svalorzen如果使用friend,通常有理由将声明类的接口保持私有,不是吗?所以简单地公开并不是一个同等的解决方案。嗯,这对我来说太紧密了。我会尝试分离抽象接口。
class Processor {
  public:
    void process(Container & container) {
      container.do_stuff();
      container.value++;
    }
};