提问人: 提问时间:7/24/2020 更新时间:7/24/2020 访问量:55
友元类和函数参数的作用域
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
A
我现在很困惑,我知道参数有一个函数原型范围的范围,但我不太了解它与 C++ 功能朋友类的关系。
谁能帮忙,我应该怎么做才能将私有传递给对象?&A::i
field
答:
1赞
songyuanyao
7/24/2020
#1
谁能帮忙,我应该怎么做才能将私有传递给对象?
&A::i
field
这取决于呼叫方是否可以访问;因为作为参数在调用方传递。A::i
&A::i
例如,是 的朋友,则可在 中访问。例如Field
A
A::i
Field
Field() : p(&A::i) {}
1赞
lubgr
7/24/2020
#2
在排队中
Field field(&A::i);
您正在从顶级范围内访问私有数据成员指针 ()。这与类是 的 无关。相反,您可以做的是授予对应该实例化对象的函数的访问,例如&A::i
Field
friend
A
friend
Field
class Field;
class A {
private:
friend Field createField();
int i;
};
本身的定义可以保持不变,而构建器功能可以是Field
Field createField()
{
// Works: &A::i is a private member, but createField is a friend
return Field{&A::i};
}
上一个:C++:模板可以成为类的朋友吗?
下一个:班级的朋友是无法接近的
评论