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 在调用方作为参数传递。

例如FieldA的好友,那么A::iField中可以访问。例如

Field() : p(&A::i) {}

行中

Field field(&A::i);

您正在从顶级范围内访问私有数据成员指针 (&A::i)。这与 class FieldAfriend 无关。相反,您可以做的是让 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};
}