通常在 C++ 中,当 A 类声明与 B 类的友谊时,B 类可以完全访问 A 类的私有成员。我需要做的是允许 B 类只访问 A 类的一个私有成员,而不能访问其他任何东西。有什么办法吗,也许是 C++11 中的新东西?
问问题
896 次
2 回答
4
不是我知道的。如果只允许访问单个成员真的很重要,您可以将数据包装在另一个具有完全私有成员的类 ( )中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
};
类似的东西。我没有通过编译器运行它来检查。
但我只是想知道......当你发现自己需要这样做时,你的设计中的某些东西是否存在根本缺陷?
于 2013-02-11T22:43:02.727 回答
1
假设您首先有充分的理由拥有一个朋友功能,那么我认为“相信”朋友功能不会接触它应该接触的其他东西并没有错。
请记住,如果该函数希望这样做,任何具有您的类地址[或可以以某种方式到达该地址]的函数都能够修改成员变量。它可能无法以可移植的、未来安全可靠的方式进行,但将指针转换为 achar *
将能够修改操作系统未确定的类中的任何内容。
关于private
, protected
, public
,friend
等的要点是允许编译器检查您是否“遵守合同” - 但它可以被决心这样做的“聪明”程序员覆盖。作为这个“契约”的一部分,一个friend
类或函数被允许接触它是一个朋友的类中的任何东西。这就是来龙去脉。如果你不想这样,那么你不应该宣布它为朋友......
于 2013-02-11T22:45:01.450 回答