朋友成员功能无法访问私人成员数据

时间:2020-09-15 15:38:23

标签: c++ friend friend-function

我尝试通过一个朋友函数访问X类的私有成员数据,该函数本身是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,但这没有帮助。.
是什么原因造成的?

3 个答案:

答案 0 :(得分:2)

由于具有循环依赖性,因此必须正确地拆分声明和定义:

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

答案 1 :(得分:1)

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

错误:尚未声明“ A”

您需要先使用函数声明类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; }

答案 2 :(得分:0)

您必须在类X之前定义类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; }
相关问题