【问题标题】:Why Friend Function cannot access private members of a class为什么朋友函数不能访问类的私有成员
【发布时间】:2021-11-01 22:04:11
【问题描述】:
class A{
public:
    void printer(){
        B obj;
        obj.private_data = 10; // <- fails, says member inaccessible
    }
}
class B{
friend void A::printer();
private:
    int private_data;
}

打印机功能是否可以访问 B 类的私有成员?我试图将 B 的 obj 作为 arg 传递给打印机,但仍然失败

【问题讨论】:

  • 我相信 推荐的编辑 是针对其中一个答案 - 而不是您的问题。基于这个假设,我将回滚您的编辑。
  • 问题中的代码没有产生评论中解释的错误消息。代码无法编译,因为B obj; 没有B

标签: c++ class friend-function


【解决方案1】:

A 类不知道 B 使用它。因此,将函数printer() 的定义推迟到定义B 之前,如果您需要B 的实例成为A 中的成员变量,那么为B 进行前向声明以声明@ 987654329@ 在A

因此,请使用如下内容:

class A {
  public:
    void printer();
};

class B {
    friend void A::printer();

  private:
    int private_data;
};

void A::printer() {
    B obj;
    obj.private_data = 10; // <- No longer fails
    std::cout << obj.private_data;
}

int main() {
    A a;
    a.printer();
}

Demo

【讨论】:

    【解决方案2】:

    为什么 Friend Function 不能访问类的私有成员?

    他们可以,但您可能需要稍微拆分类的定义。

    添加的虚构文件:

    定义A(文件a.hpp):

    class A {
    public:
        void printer();
    };
    

    定义B(文件b.hpp):

    #include "a.hpp" // B must see the definition of A to befriend a member function
    
    class B {
        friend void A::printer();
    
    private:
        int private_data;
    };
    

    定义A的成员函数(文件a.cpp):

    void A::printer() {
        B obj;
    
        obj.private_data = 10;
    }
    

    【讨论】:

      【解决方案3】:

      要访问B,首先需要定义它。因此,您可以在定义类 B 之后声明方法 printer定义它。

      class A {
      public:
        void printer();
      };
      
      class B {
      private:
        friend class A;
        int private_data;
      };
      
      void A::printer() {
        B obj;
        obj.private_data = 10;
      }
      

      注意,无论如何,您可能希望将方法从类定义中移出并放入单独的.cpp 文件中。在类中定义的方法被隐式标记为inline,这可能不是您所期望的。

      【讨论】:

        猜你喜欢
        • 2021-08-16
        • 1970-01-01
        • 1970-01-01
        • 2015-11-24
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-16
        相关资源
        最近更新 更多