1

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

4

2 回答 2

4

不是我知道的。如果只允许访问单个成员真的很重要,您可以将数据包装在另一个具有完全私有成员的类 ( )中C,使该类成为.BCA

像这样的东西:

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

类似的东西。我没有通过编译器运行它来检查。

但我只是想知道......当你发现自己需要这样做时,你的设计中的某些东西是否存在根本缺陷?

于 2013-02-11T22:43:02.727 回答
1

假设您首先有充分的理由拥有一个朋友功能,那么我认为“相信”朋友功能不会接触它应该接触的其他东西并没有错。

请记住,如果该函数希望这样做,任何具有您的类地址[或可以以某种方式到达该地址]的函数都能够修改成员变量。它可能无法以可移植的、未来安全可靠的方式进行,但将指针转换为 achar *将能够修改操作系统未确定的类中的任何内容。

关于private, protected, public,friend等的要点是允许编译器检查您是否“遵守合同” - 但它可以被决心这样做的“聪明”程序员覆盖。作为这个“契约”的一部分,一个friend类或函数被允许接触它是一个朋友的类中的任何东西。这就是来龙去脉。如果你不想这样,那么你不应该宣布它为朋友......

于 2013-02-11T22:45:01.450 回答