友元类和函数参数的作用域

friend class and the scope of function arguments

提问人: 提问时间:7/24/2020 更新时间:7/24/2020 访问量:55

问:

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

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

编译器抱怨的是类的私有。iA

我现在很困惑,我知道参数有一个函数原型范围的范围,但我不太了解它与 C++ 功能朋友类的关系。

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

C++ 友类

评论


答:

1赞 songyuanyao 7/24/2020 #1

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

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

例如,是 的朋友,则可在 中访问。例如FieldAA::iField

Field() : p(&A::i) {}
1赞 lubgr 7/24/2020 #2

在排队中

Field field(&A::i);

您正在从顶级范围内访问私有数据成员指针 ()。这与类是 的 无关。相反,您可以做的是授予对应该实例化对象的函数的访问,例如&A::iFieldfriendAfriendField

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