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

Why Friend Function cannot access private members of a class

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;
}

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

Class A 不知道 B 使用它。因此,将函数 printer() 的定义推迟到定义 B 之前,如果您需要 B 的实例作为 A 中的成员 var,则进行前向声明BA.

中声明一个 B*

因此,使用如下内容:

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

Why Friend Function cannot access private members of a class?

它们可以,但您可能需要将 class 的定义稍微拆分一下。

虚构文件添加:

定义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;
}

要访问B,您首先需要对其进行定义。因此,您可以 声明 方法 printer 并在定义 class B.

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

class B {
private:
  friend class A;
  int private_data;
};

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

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