friend class 和函数参数的范围
friend class and the scope of function arguments
我正在写一个自用的反射实用程序,我简化了代码(删除了复杂的模板)如下:
class A {
private:
friend class Field;
int i;
};
class Field {
public:
Field(int A::* p) : p(p) {}
private:
int A::* p;
};
Field field(&A::i);
编译器抱怨 i
是 class 私有的 A
。
我现在很困惑,我知道参数的范围是函数原型范围,但我不太了解它与C++特性朋友的关系classes.
任何人都可以帮助我如何将私有 &A::i
传递给 field
对象?
Can anyone help what should I do to pass the private &A::i
to the field
object?
取决于调用方是否可以访问A::i
;因为 &A::i
在调用方作为参数传递。
例如Field
是A
的好友,那么A::i
在Field
中可以访问。例如
Field() : p(&A::i) {}
行中
Field field(&A::i);
您正在从顶级范围内访问私有数据成员指针 (&A::i
)。这与 class Field
是 A
的 friend
无关。相反,您可以做的是让 friend
访问一个应该实例化 Field
对象的函数,例如
class Field;
class A {
private:
friend Field createField();
int i;
};
Field
本身的定义可以保持不变,而builder函数可以是
Field createField()
{
// Works: &A::i is a private member, but createField is a friend
return Field{&A::i};
}
我正在写一个自用的反射实用程序,我简化了代码(删除了复杂的模板)如下:
class A {
private:
friend class Field;
int i;
};
class Field {
public:
Field(int A::* p) : p(p) {}
private:
int A::* p;
};
Field field(&A::i);
编译器抱怨 i
是 class 私有的 A
。
我现在很困惑,我知道参数的范围是函数原型范围,但我不太了解它与C++特性朋友的关系classes.
任何人都可以帮助我如何将私有 &A::i
传递给 field
对象?
Can anyone help what should I do to pass the private
&A::i
to thefield
object?
取决于调用方是否可以访问A::i
;因为 &A::i
在调用方作为参数传递。
例如Field
是A
的好友,那么A::i
在Field
中可以访问。例如
Field() : p(&A::i) {}
行中
Field field(&A::i);
您正在从顶级范围内访问私有数据成员指针 (&A::i
)。这与 class Field
是 A
的 friend
无关。相反,您可以做的是让 friend
访问一个应该实例化 Field
对象的函数,例如
class Field;
class A {
private:
friend Field createField();
int i;
};
Field
本身的定义可以保持不变,而builder函数可以是
Field createField()
{
// Works: &A::i is a private member, but createField is a friend
return Field{&A::i};
}