好友成员函数无法访问私有成员数据

friend member function can't access private member data

我尝试访问 class X 的私有成员数据,使用友元函数,它本身是 class A 的成员函数。
这是代码:

class X {
    int foo;
public:
    friend void A::func(X x1);
};

class A {
public:
    void func(X x1) { x1.foo = 999; }
};

这不会编译,原因是:
Error C2248 'X::foo': cannot access private member declared in class 'X'

我尝试更改顺序,在 X 之前声明 A,但没有帮助..
这是什么原因造成的?

您必须在 class X 之前定义 class A,例如

class X;

class A {
public:
    void func(X x1);
};

class X {
    int foo;
public:
    friend void A::func(X x1);
};

void A::func(X x1) { x1.foo = 999; }

或者代替前向声明

class X;

您可以使用详细的类型说明符,例如

class A {
public:
    void func(class X x1);
};

class X {
    int foo;
public:
    friend void A::func(X x1);
};

void A::func(X x1) { x1.foo = 999; }

您忽略了另一个错误。即:

error: 'A' has not been declared

您需要先用函数声明 class A,然后才能在 X 中将其作为好友引用。但是函数需要一个X,所以你还需要先声明X

它应该看起来像:

class X;

class A {
public:
    void func(X x1);
};

class X {
    int foo;
public:
    friend void A::func(X x1);
};

void A::func(X x1) { x1.foo = 999; }

你必须正确拆分声明和定义,因为你有循环依赖:

class X;

class A {
public:
    void func(X x1);
};

class X {
    int foo;
public:
    friend void A::func(X x1);
};

void A::func(X x1) { x1.foo = 999; }

Demo