4

我正在编写一个供自己使用的反射实用程序,我简化了代码(删除复杂的模板),如下所示:

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);

编译器抱怨iis private of class A

我现在很困惑,我知道参数的作用域是函数原型作用域,但我不太了解它与 C++ 特性朋友类的关系。

谁能帮助我应该怎么做才能将私有传递&A::ifield对象?

4

2 回答 2

1

谁能帮助我应该怎么做才能将私有传递&A::ifield对象?

取决于A::i调用方是否可以访问;因为&A::i在调用方作为参数传递。

例如,Field是 的朋友A,则可A::i在 中访问Field。例如

Field() : p(&A::i) {}
于 2020-07-24T08:41:43.137 回答
1

在行

Field field(&A::i);

您正在&A::i从顶级范围内访问私有数据成员指针 ()。这与属于 的Fieldfriend无关A。相反,您可以做的是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};
}
于 2020-07-24T08:41:56.653 回答