单身成员而不是全班的朋友声明?

时间:2013-02-11 22:33:20

标签: c++ oop class c++11 friend

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

2 个答案:

答案 0 :(得分:3)

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

这样的事情:

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

这样的事情。我没有通过编译器运行它来检查。

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

答案 1 :(得分:1)

假设你有一个很好的理由首先拥有一个朋友功能,那么我认为“信任”朋友功能没有触及其他东西而不是它应该触摸的东西没有错。

请记住,任何具有您的类地址[或可以某种方式到达地址]的函数都能够修改成员变量,如果该函数希望这样做的话。它可能无法以便携式,未来安全可靠的方式执行,但是向char *投射指针将能够修改未被操作系统确定的类中的任何内容。

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