我尝试通过一个朋友函数访问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,但这没有帮助。.
是什么原因造成的?
答案 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; }
答案 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; }