单个成员而不是整个类的友元声明

Friend declaration for single member instead of whole class?

本文关键字:友元 声明 成员 单个      更新时间:2023-10-16

通常在C++中,当类A与类B声明友谊时,类B可以完全访问类A的私有成员。我需要做的是允许类B只访问类A的一个私有成员,而不访问其他成员。有什么办法吗,也许是C++11中的新东西?

我不知道。如果只允许访问单个成员非常重要,那么可以将数据封装在另一个具有完全私有成员的类(C)中,使该类成为B的朋友,并为A中的C对象提供公共访问器。

类似这样的东西:

template<class T> class MatesWithB
{
     friend class B;
  public:
     MatesWithB( T & val ) : data(val) {}
  private:
     T& data;
     operator T&()             { return data; }
     operator const T&() const { return data; }
};
class A
{
      // ...
      MatesWithB<int> GetPrivateThingy() { return MatesWithB(thingy); }
   private:
      int thingy;            // Shared with class B
};

类似的东西。我还没有通过编译器来检查这个。

但我只是想知道。。。当你发现自己需要这样做时,你的设计中不是有根本的缺陷吗?

假设你有充分的理由首先拥有一个friend函数,那么我认为"信任"friend函数不接触它应该接触的东西没有什么错。

请记住,如果任何函数希望修改成员变量,那么任何具有类地址[或可以以某种方式访问该地址]的函数都可以修改该成员变量。它可能无法以可移植、未来安全可靠的方式进行修改,但将指针投射到char *将能够修改类中未被操作系统确定的任何内容。

privateprotectedpublicfriend等的要点是允许编译器检查您是否"遵守了约定",但它可以被决心这样做的"聪明"程序员覆盖。作为"约定"的一部分,friend类或函数可以接触它的朋友类中的任何东西。事情就是这样。如果你不想这样,那么你就不应该宣布它是朋友。。。