通常在C ++中,当A类声明与B类的友谊时,B类可以完全访问A类私有成员。我需要做的是允许B类只访问A类的一个私有成员,而不是其他任何东西。有没有办法,也许是C ++ 11中的新东西?
答案 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 *
投射指针将能够修改未被操作系统确定的类中的任何内容。
关于private
,protected
,public
,friend
等的观点是允许编译器检查您是否“遵守合同” - 但它可以被那些决心这样做的“聪明”程序员所覆盖。作为这个“契约”的一部分,允许friend
类或函数触及它所属的类中的任何东西。这就是来龙去脉。如果你不想那样,那么你不应该宣称它是朋友......