C++友元类

3

只是想确保我正确理解了这个问题

class A
{
  friend class B;
  int valueOne;
  int valueTwo;
  public:
  int GetValueOne(){ return valueOne; }
}
class B
{
  public:
  A friendlyData;
  int GetValueTwo(){ return friendlyData.valueTwo; }
}
main()
{
  B myObject;
  myObject.friendlyData.GetValueOne(); // OK?
  myObject.GetValueTwo(); // OK?
}

关于那段代码,如果我们忽略初始化的缺失,主函数中的两个函数是可以正常工作的,对吗?除了执行一些花哨的操作外,没有其他方法可以从这些类中获取数据... 对于这些类的外部,B.A 没有可访问的数据,只有成员函数。


永远不要将任何非常量属性公开。 - Šimon Tóth
你能解释一下你所说的那些吗? - thecoshman
请重新检查您的代码... B.A.GetValueOne() 是编译器错误。您是不是想写 myObject.friendlyData.GetValueOne()?下一行也是同样的情况。 - David Rodríguez - dribeas
2个回答

2

是的,main中标识的两个调用是正确的。它们涉及3个成员的访问:B::AB::GetValueTwoA::GetValueOne。所有这些成员都具有public可访问性,并且没有暴露任何私有类型。因此,它们可以从任何地方使用,包括main


0

看起来很合理,因为GetValueX方法都是公共的,所以调用是正确的。对GetValueTwo()的调用利用了它的友元关系。

警告:友元关系可能会破坏您设计中的封装性。


2
或者说友谊可以增强封装性:http://www.drdobbs.com/184401197 和 https://dev59.com/QXNA5IYBdhLWcg3wGJwV#1093681 - Fred Larson
非常正确,我正在尝试寻找一篇更深入讨论这个问题的GoTW参考。 - Flexo
友谊也可以改善你的设计封装性。这取决于你如何使用它。 - aschepler
根据Stroustrup的说法,友元并不会破坏封装性。 - fredoverflow
这些参考资料都支持“与”自由函数交朋友的观点,但它们似乎没有为类之间的友谊提出类似的论点。 - Flexo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接